如题
在新公司,还没弄清这边的习惯,结果写代码的时候悲剧了,都是根据以前的经验写的
在关联表操作的时候加上了 transaction,在 partial 里面用的是@var
,结果 push 代码后,架构师说不要用 transaction,这样会锁行,然后影响性能,还有要把 partial 当成 function 来看,尽量不要里面使用类似@var
的变量,而要用 local var,然后我就想问:
@var
好还是 local varthx!!!
1.如果关联表操作用的是 AR callback,那自动就加了 transaction 哦。如果自己写存储流程的话,建议还是加上比较好。淘宝可能有强大的异步机制吧,所以不用,这个我猜的。
2.partial 用 local var,不过有时一个 partial 在哪里使用到自己心里清楚的话,用@var
也未尝不可嘛。
经典例子就是银行取款,如果一边在提款机取钱,一边用存折在柜台取钱,如果两边同时取,一个账号只有 1000 元有可能被两边都取走,那怎么办呢?就给账号上个锁,一边操作的时候账户就锁住,另一边的操作只能排队,这就保证每次账户数据都是正确的。这就是事务,transaction,同步问题,资源锁的一个例子。有很多地方说事务就是里面的操作要不全改,要不全不改,这其实说的是事务的特点,也是一回事,全不改就是事务中如你银行操作其中一步错了,账户就会回滚,所有操作都不起效。如你所见,事务,上锁,是为了保证数据一致,上了锁,大家都得排队,性能就慢下来了
http://api.rubyonrails.org/classes/ActiveRecord/Transactions/ClassMethods.html 看了一下 api 确实需要加上好点 特别是 balance 这样的字段
#13 楼 @tumayun 我觉得看你这种说法,deals.save 和 n_deals.save,是需要 Transaction 的,不然你这段代码的结果是未知的,大多情况未知的状况不失很你可以再这段代码改成:
deals.save
raise "stupid error"
n_deals.save
然后看看数据库的结果给是否满足你们的需求,如果这样的数据无所谓依然可以继续的话,那就不用。但是这显然不是一个一刀切的问题,如果为性能不用 transaction,可是要设计一个回滚 deals 的办法,这种情况性能可能还不如 transaction。
即便是在 model 中的方法,以上的情况也是存在的。