数据库隔离级别对嵌套事务的影响

最近做了一个区块链数据相关的项目,业务系统需要跟区块链上数据同步,在测试环境没有任何问题,部署到成员方之后突然出现数据同步失败。仔细分析了业务代码没有发现任何异常,对比了各种环境之后,发现只有数据库事务隔离级别不同,怀疑是隔离级别导致。

整个数据同步流程的事务情况为

1.对每个块开启一个外层事务。

2.循环对块中的每笔交易使用require_new开启一个内层事务。

3.提交内层事物。

4.提交外层事务。

由于每笔交易的处理需要校验起始金额,而起始金额需要依赖前一笔交易的处理结果。

事务的隔离级别为rc时外层事务可以读到内层提交的事务结果,当为rr时外层事务无法读到内层事务提交的结果。

基于以上两点,我们可以得出

在数据库隔离级别为rc时,不会有任何问题。

在数据库隔离级别为rr时,如果一个块中只有一笔交易也不会有问题。

在数据库隔离级别为rr时,如果一个块中有多笔交易就会有问题。原因是处理完块中第一笔交易之后再处理第二笔时,第一笔交易的处理结果虽然已经提交但是外层事务不可见,所以在处理第二笔时校验起始金额出错,然后整个外层事务会回滚,重新处理第一笔交易。但是由于第一笔交易已经提交到数据库,所以依然处理失败。

在事务有嵌套的时候一定要注意事务隔离级带来的影响。

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
事务隔离级别NESTED是指如果当前方法正有一个事务在运行中,则该方法应该运行在一个嵌套事务中,被嵌套事务可以独立于被封装的事务中进行提交或者回滚。如果封装事务存在,并且外层事务抛出异常回滚,那么内层事务必须回滚,反之,内层事务并不影响外层事务。如果封装事务不存在,则与propagation_required的隔离级别相同。\[2\] #### 引用[.reference_title] - *1* [事务隔离级别和传播行为](https://blog.csdn.net/m0_73684185/article/details/130069226)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Spring事务七大传播机制与五个隔离级别](https://blog.csdn.net/m0_37125796/article/details/85019392)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [01. 数据库事务的隔离等级及如何设置](https://blog.csdn.net/m0_46836425/article/details/121851867)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值