前两天,项目中遇到一个问题,在多线程批量更新订单时,数据库产生死锁,查了半天最终才找到原因。
SQL如下:
|
|
其中TEAM_ID是主键,第一眼看到这条sql时就感觉奇怪,为啥要update主键呢?当时也没有太在意,这条sql并不是我写的,我只是用一下而已,心想也许写这条sql的同事有特别的用意吧。
当我使用这条sql进行多线程批量更新订单时Oracle产生死锁,而我的每个线程update的订单都是独立的,互不交叉,而Oracle又是默认行锁的,怎么可能产生死锁呢,最后leader看到说是数据库产生表锁了,把T.TEAM_ID = #teamId#这句去掉的确好了。
