问题:
公司项目使用Postgresql数据库FDW技术,持久层使用Spring data jpa,使用悲观锁后,然后更新时出现死锁问题。
产生现象及解决方法:
数据库内:
实体表名:TABLE
FDW表名:TABLE01
(1)死锁产生
SELECT * FROM TABLE WHERE ID='123' FOR UPDATE NOWAIT;
UPDATE TABLE01 SET NAME='liugd' WHERE ID='123'
(2)正常结束
SELECT * FROM TABLE WHERE ID='123' FOR UPDATE NOWAIT;
UPDATE TABLE SET NAME='liugd' WHERE ID='123'
(3)死锁产生
SELECT * FROM TABLE01 WHERE ID='123' FOR UPDATE NOWAIT;
UPDATE TABLE SET NAME='liugd' WHERE ID='123'
(4)正常结束
SELECT * FROM TABLE01 WHERE ID='123' FOR UPDATE NOWAIT;
UPDATE TABLE01 SET NAME='liugd' WHERE ID='123'
结论:
Postgresql数据FDW的事务和实体表事务不是同一个事物,使用实体表去锁,更新的时候需要使用实体表去更新。然而反之。
个人结论,如有问题请留言。