原因:
在可重复读的隔离级别中,第一个事务阻塞第二个事务,只有两个事务作用的行有交叉才会发生阻塞,有以下两种情况:
1、正常的锁阻塞
(1)第一个事务如果是仅仅查询导致的锁(select for update/share),而不是修改的导致的锁
(2)那么第二个事务同样用锁方式(增删改查导致的锁都可以)操作相同数据行的数据,仅仅会被阻塞,不会抛出异常。此时第二个被阻塞的事务只要等第一个事务释放锁之后(事务提交或回滚),就可以继续执行。
2、第二个事务直接抛异常ERROR: could not serialize access due to concurrent update
第一个事务不论是修改提交或者是删除提交,被阻塞的第二个事务都不能修改、删除或者锁住第一个事务所影响的行。否则第二个事务返回 ERROR: could not serialize access due to concurrent update。