并发请求 + 事务嵌套 + 更新数据 = 死锁
2018-09-17 16:26
1216 查看
今有幸为同事排查死锁问题。
问题描述:一个get接口,内依据参数执行select ... for update,未考虑并发场景,导致程序死锁,且只要并发请求该接口,几乎百发百中。
问题定位:
1.检测数据库死锁情况,结果无。
2.接口内无相关共享资源,不会死锁
3.由于从事许久事务方面工作,所以想到了事务传播机制,果不出所料,其配置文件中get*接口配置的传播机制是SUPPORTS,故判断应该是事务嵌套死锁。
问题解释:A请求开启新事物执行update,此时来了B请求update,由于是SUPPORTS,所以加入A事务,A事务中语句执行完毕但事务需等待B完成后才能提交,而B中语句需等待A中提交后才能执行,所以出现了并发请求 + 事务嵌套 + 数据库更新导致死锁问题。
可参考下图:
问题描述:一个get接口,内依据参数执行select ... for update,未考虑并发场景,导致程序死锁,且只要并发请求该接口,几乎百发百中。
问题定位:
1.检测数据库死锁情况,结果无。
2.接口内无相关共享资源,不会死锁
3.由于从事许久事务方面工作,所以想到了事务传播机制,果不出所料,其配置文件中get*接口配置的传播机制是SUPPORTS,故判断应该是事务嵌套死锁。
问题解释:A请求开启新事物执行update,此时来了B请求update,由于是SUPPORTS,所以加入A事务,A事务中语句执行完毕但事务需等待B完成后才能提交,而B中语句需等待A中提交后才能执行,所以出现了并发请求 + 事务嵌套 + 数据库更新导致死锁问题。
可参考下图:
相关文章推荐
- 并发数据库事务缺锁导致的数据不一致情况:丢失更新,脏读,不可重复读,幻读
- Oracle学习笔记(7)-----------数据更新、事务处理、数据伪列
- 数据库死锁导致分布事务中大批量更新数据库不成功
- Entity Framework 学习初级篇7--基本操作:增加、更新、删除、事务,处理并发问题
- 完全代码实现UITableView下拉更新,异步请求数据
- Oracle笔记七:数据更新、事务处理、数据伪列
- 关于解决JQuery发送Ajax请求后,IE缓存数据不更新的问题
- 查询数据的时候 提示事务(进程 ID **)与另一个进程被死锁在 锁 资源上,并且已被选作死锁牺牲品。
- awk:查看Apache的并发请求数及其TCP连接状态数据
- iOS中FMDB事务实现批量更新数据
- 《连载 | 物联网框架ServerSuperIO教程》- 17.集成Golden实时数据库,高并发保存测点数据。附:3.4 发布与版本更新说明。
- 使用angularjs异步请求数据(http请求或者使用Websocket)的时候,更新$scope中的dom的方法
- Sql Server 中如果使用TransactionScope开启一个分布式事务,使用该事务两个并发的连接会互相死锁吗
- Sequelize 事务大并发下造成的死锁问题。
- 多个事务并发执行update出现的数据库死锁问题排除
- sql server在高并发状态下同时执行查询与更新操作时的死锁问题
- Vue 路由嵌套、数据请求、组件
- Android RecyclerView嵌套EditView实时更新Item数据
- ListView嵌套在TabActivity里数据不更新解决办法
- MySQL并发更新数据加锁处理