Oracle中,更新主键时会产生表锁

前两天,项目中遇到一个问题,在多线程批量更新订单时,数据库产生死锁,查了半天最终才找到原因。

SQL如下:

1
2
3
4
5
6
7
8
9
10
11
UPDATE
T_TEAM_ORDER T
SET
T.TEAM_ID = #teamId#,
T.PASS_NUM =T.PASS_NUM + #passNum#,
T.WAIT_NUM =T.WAIT_NUM - #waitNum#,
T.FCNY = T.FCNY + #fcny#,
T.SCNY = T.SCNY + #scny#,
T.PAY_LIMIT = #payDate#
WHERE
T.TEAM_ID = #teamId#

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