jdbc的commit和rollback
commit和rollback是数据库事务的两个概念。
一个数据库事务有开始和结束边界(boundary), 位于boundary的对数据库的各种操作认为是对该事务的操作。
一个事务的要占用数据库的一些资源,比如可能获得数据库的某个表的某条记录的lock,如果一个事务长期占用资源而不去释放,那么对其他的事务是不利的,可能会使得速度很慢。
所以对数据库操作的正确做法是让事务短小,只做一些应该在事务里边做的事情,以最快的速度让一个事务结束,从而释放该事务所占有的资源。
如何让一个事务结束?commit或者rollback。两者选其一,而且必选其一,才能够确保一个事务被可靠的,安全的终止。commit意味着对事务中的操作确定,rollback意味着对事务中的操作否定。
JDBC中如何正确的处理事务?
1。如果需要保持一些操作的原子性,比如转帐就需要原子性,那么必须要将这些操作放在一个事务中。
Connection conn = 。。。;
conn.setAutoCommit(false);
//从一个人那里扣钱
//往另一个人那里加钱
//做一些其他的事情,比如通过jms来广播一条成功的消息
conn.commit();
上面的代码看起来似乎完成了转帐的操作,其实需要的改进的地方很多。
1)不能保证上面的事务能够可靠的终止。
如果对数据库的扣钱,加钱操作失败,那么conn.commit()不会被执行。
2)通过jms来广播消息动作跟这个事务没有太大的关系,所以不应该放在事务中。试想如果jms广播需要花5s的时间,那么该事务结束的时间就要推迟5s,释放lock的时间也要被推迟5s!
正确的代码:
Connection conn = 。。。;
boolean success = false;
try{
conn.setAutoCommit(false);
//从一个人那里扣钱
//往另一个人那里加钱
conn.commit();
success = true;
}
catch(SQLException e){
conn.rollback();
success = false;
}
if(success)//做一些其他的事情,比如通过jms来广播一条成功的消息
2。如果不需要处理原子性的操作,比如查询,那么只需要conn.setAutoCommit(true);做就可以了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
2011-12-28 isMemberOfClass和isKindOfClass之间区别
2011-12-28 isKindOfClass是什么意思?有什么作用 (转)
2011-12-28 NSIndexPath(转)