DataSource相关事务处理的一个问题

本文探讨了在使用Spring JDBC框架时遇到的DataSource事务处理问题。当多个DAO操作在同一个事务中,由于数据库会话的特性,可能导致数据不一致。例如,在未提交事务的情况下更新maxid,后续操作可能获取到旧值。为解决此问题,提出了三种方案:1) 分割成独立事务;2) 程序内手动管理maxid状态;3) 使用同一个Connection完成所有DAO操作。这提醒我们在设计事务时要考虑数据库会话和连接管理。
摘要由CSDN通过智能技术生成

在现在的OR方案和SPRING JDBC框架中,对数据库事务处理均是对java.sql.DataSource处理的。

大致思路是:在开始事务时,事务管理器会记录DataSource的连接,以后每个DAO从DataSource中getConnection()时,事务管理器会判断这个Connection是不是当前控制事务的子线程打开的,如果是,则记录并对此Connection进行事务处理,在commit和rollback事务时,会对所有打开的Connection进行Commit和rollback,最终清理所有Connection资源。

大伙可能知道,数据库对事务缓存是按会话区分的。一个Connection就是一个会话。举例说明:

maxid
1
 

for(A、B){

    1:取maxid;

    其他操作

    2:更新maxid++;

}

这假设的A、B两个完全相同的业务操作。每个操作下又有1、2两个DAO操作。

   在执行 A.1时,取出最大值maxid=1

   执行   A.2时,更新成maxid=2

   扫行   B.1时,取出最大值max=? 这正确的应该是2,而实际取到的是1

这就有一个问题,B.1的结果是错误的。分析原因:因为上面三个步骤可能都是单独的Connection,在执行A.2后,该事务并未提交(因为大的事务未完成),

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值