为什么这个Rails事务无法锁定?

时间:2014-01-21 22:30:04

标签: ruby-on-rails postgresql ruby-on-rails-4

为什么我不能锁定此记录?

  User.transaction do
    p current_user.inspect
    p "************"
    user = current_user.lock!
    p "************"

日志

"#<User id: 1, username: ...
"************"
PG::InFailedSqlTransaction: ERROR:  current transaction is aborted, commands ignored until end of transaction block
: SELECT  "users".* FROM "users"  WHERE "users"."id" = $1 LIMIT 1 FOR UPDATE

ActiveRecord::StatementInvalid (PG::InFailedSqlTransaction: ERROR:  current transaction is aborted, commands ignored until end of transaction block
: SELECT  "users".* FROM "users"  WHERE "users"."id" = $1 LIMIT 1 FOR UPDATE):
  app/controllers/users_controller.rb:294:in `block in withdrawBTC'

控制台

我可以从控制台锁定它。

irb(main):021:0> User.transaction do
irb(main):022:1* u.lock!
irb(main):023:1> end

版本

Rails 4.0.0

2 个答案:

答案 0 :(得分:3)

很奇怪,我重新启动了服务器,它越过了那条线。我不知道为什么,因为它处于开发模式。 Rails,你这么片状!

答案 1 :(得分:1)

在这种情况下,它可能不是Rail的错,虽然Rails确实很奇怪而且非常脆弱。

这部分输出:

ERROR:  current transaction is aborted, commands ignored until end of transaction block

表示同一事务中的上一个命令失败,并且您的程序(或Rails)忽略了该错误并尝试继续。这不起作用 - 后续命令只会在事务回滚之前失败。