如下图所示,假设事务A持有行1的共享锁,事务B持有行2的共享锁,那么此时事务A请求持有行2的排他锁,那么在事务B释放资源之前都处于阻塞等待的状态,同样的事务B请求持有行1的排他锁,在事务A 释放资源之前同样也是处于阻塞等待的状态。也就是说事务 B 完成之后事务 A 才能完成,而事务A的完成又依赖于事务B的完成,这就形成了循环依赖的问题,最终导致死锁情况的发生。
如何确定死锁位置
//先确定数据库有没有死锁情况发生
select * from pg_stat_activity where datname = 'product_db';
//查询可能锁了的表的oid
select oid from pg_class where relname='product';
//查询对应的pid
select pid from pg_locks where relation='oid' //上面查询出来的oid