mysql - sqlite 事务未显示在 test.log 中

标签 mysql ruby-on-rails sqlite transactions rspec

我开始使用 sqlite 开发我的 Rails 应用程序。我已经到了需要确保某些代码在数据库事务下运行的地步,这对我来说是新事物。在开始旅程之前,我不想看到每个测试用例中使用的事务。毕竟,我需要禁用它们来测试此功能。

当我看到任何一个规范的 test.log 时,我会在 test.log 中得到类似这样的内容:

SQL (0.2ms)  SELECT 1 FROM "users" WHERE ("users"."login" = 'jaimito1') LIMIT 1
SQL (0.2ms)   SELECT name
FROM sqlite_master
WHERE type = 'table' AND NOT name = 'sqlite_sequence'
AREL (0.5ms)  INSERT INTO "users" ("login", "password_digest", "created_at", "updated_at") VALUES ('jaimito1', '$2a$10$lJ/qIMfKymDmKuY6fYQF.u3bg8/ZdIzGU04MsjC6vJk8qygMEiemC', '2011-07-31 21:32:05.886797', '2011-07-31 21:32:05.886797')

即使我的 spec_helper.rb 中有 config.use_transactional_fixtures = true,也没有任何交易的迹象

如果将我的数据库更改为 MySQL,相同的测试会在 test.log 中产生以下输出:

SQL (0.2ms)  BEGIN
SQL (0.2ms)  SAVEPOINT active_record_1
SQL (0.3ms)  SELECT 1 FROM `users` WHERE (`users`.`login` = BINARY 'jaimito1') LIMIT 1
SQL (5.9ms)  SHOW TABLES
SQL (1.2ms)  describe `users`
AREL (0.3ms)  INSERT INTO `users` (`login`, `password_digest`, `created_at`, `updated_at`) VALUES ('jaimito1', '$2a$10$Ujsv0XGRLyHBZsI7sY4Vf.jv3bm1fyfeueV79o91gDY9xbdc7KUGC', '2011-07-31 19:50:28', '2011-07-31 19:50:28')
SQL (0.1ms)  RELEASE SAVEPOINT active_record_1
SQL (0.7ms)  ROLLBACK

所以呢?这里发生了什么?为什么没有显示 sqlite 的交易?我的理解是 Rails 支持 sqlite 事务。

我的版本:Mac OS X 10.6.8、Rails 3.0.9、sqlite 3.7.6、sqlite3 gem 1.3.3、ruby 1.9.2p290、mysql 5.0.91

最佳答案

ActiveRecord 3.0.9 does not support savepoints for sqlite :

# activerecord-3.0.9/lib/active_record/connection_adapters/abstract_adapter.rb
# Does this adapter support savepoints? PostgreSQL and MySQL do, SQLite does not.
def supports_savepoints?
  false
end

最新3.1 release candidate (3.1.0.rc5 as of this writing) does support savepoints因为support was added in January 2011 .

感谢Rails 3. Nested transactions. Exception in a child block帮助回答这个问题。

关于mysql - sqlite 事务未显示在 test.log 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6892630/

相关文章:

MySQL 查询消耗了过多的系统 CPU 处理器时间

html - 在同一 Rails 应用程序中使用两个独立的 CSS 框架

database - 如何在 Mac 终端窗口中将 sql 文件读入 sqlite 命令

c# - C# 应用程序的 SQlite 部分耗时太长

MySQL:对于每个id,使用顺序日期来计算它们之间的空间

javascript - 为用户返回时保存表单数据

mysql - 查询 : Select products from master- and subcategories

ios - 对于同一应用程序的 iOS 和 Web 客户端,我是否需要在 Spotify 开发者网站上使用两个不同的应用程序?

ruby-on-rails - ruby 和 rails 中的资源路由

mysql - 将列值从一个表复制到另一个匹配的 ID - SQLite