Cause: org.postgresql.util.PSQLException: ERROR: deadlock detected 检测到死锁异常排查处理

3 篇文章 0 订阅
2 篇文章 0 订阅

报错内容如下:

org.springframework.dao.DeadlockLoserDataAccessException: 
### Error querying database.  Cause: org.postgresql.util.PSQLException: ERROR: deadlock detected
  详细:Process 7372 waits for ShareLock on transaction 46061491; blocked by process 4624.
Process 4624 waits for ShareLock on transaction 46061490; blocked by process 7372.
  建议:See server log for query details.
  在位置:while locking tuple (0,1) in relation "tas_book_type"

sql语句如下:

SELECT p.book_code, p.book_type_code, p.ind_blk_u, d.tree_data_code, d.data_name
    , d.data_type, d.berth_type, d.linked_code, d.city_code, d.stg_sec_code
    , d.tree_code, ps.ef_status, ps.execute_status, ps.interrupt, ds.lock_source
FROM tas_book p
    LEFT JOIN tas_book_type pt ON p.book_type_code = pt.book_type_code
    LEFT JOIN tas_book_status ps ON p.book_code = ps.book_code
    LEFT JOIN tas_tree_data_status ds ON ps.pen_code = ds.tree_data_code
    LEFT JOIN tas_tree_data d ON d.tree_data_code = ds.tree_data_code
WHERE p.ind_blk_u = 0
    AND pt.is_fixed = '0'
    AND pen_code != ''
    AND pen_code IS NOT NULL
    AND d.city_code = '13'
    AND ps.ef_status = '1'
    AND ps.execute_status = '1'
ORDER BY random()
LIMIT 1
FOR UPDATE

经分析发现tas_book_type与tas_book是一对多的关系,且tas_book_type内的数据基本不用修改,但上面的sql语句把它用来关联加锁查询,这样每次查到一条数据就会对这张表进行加锁,导致很多事务都要对其加锁,严重影响查询效率,还会造成死锁问题。经过研究最终sql优化如下:

SELECT p.book_code, p.book_type_code, p.ind_blk_u, d.tree_data_code, d.data_name
    , d.data_type, d.berth_type, d.linked_code, d.city_code, d.stg_sec_code
    , d.tree_code, ps.ef_status, ps.execute_status, ps.interrupt, ds.lock_source
FROM tas_book p
    LEFT JOIN tas_book_status ps ON p.book_code = ps.book_code
    LEFT JOIN tas_tree_data_status ds ON ps.pen_code = ds.tree_data_code
    LEFT JOIN tas_tree_data d ON d.tree_data_code = ds.tree_data_code
WHERE p.ind_blk_u = 0
    AND p.book_type_code= 'student'
    AND pen_code != ''
    AND pen_code IS NOT NULL
    AND d.city_code = '13'
    AND ps.ef_status = '1'
    AND ps.execute_status = '1'
ORDER BY random()
LIMIT 1
FOR UPDATE skip locked

通过测试发现极大的提升了查询效率,并且不会出现死锁情况。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值