我目前正在玩交易,无法围绕以下场景进行思考:
假设有用户名“johnny”和全名“John Smith”的用户。
我启动两个 Rails 控制台并按此顺序执行以下命令:
控制台 A:
ActiveRecord::Base.transaction { user = User.find_by_username("foo"); sleep 10; user.update_attribute(:full_name, "#{user.full_name}-1"); }
控制台 B:
ActiveRecord::Base.transaction { user = User.find_by_username("foo"); sleep 10; user.update_attribute(:full_name, "#{user.full_name}-2"); }
所以时间安排如下:
A 读“约翰·史密斯”
B 读“约翰·史密斯”
A 写“John Smith-1”
B 写“约翰·史密斯-2”
根据我的数据库类事务 B 应该无法写入“John Smith-2”,因为数据在读取后发生了变化。所以事务应该被回滚并且事务A应该获胜。我希望用户名是“John Smith-1”,但结果是“John Smith-2”。
任何想法为什么会发生这种情况或如何获得预期的行为?
亲切的问候
尼尔斯