2019独角兽企业重金招聘Python工程师标准>>>

用一个简单的例子来说明Java处理事务:

我们用银行转账的时候可以简单的看成是两步操作--将钱从A账户转出和将钱转到B账户。问题来了,如果我从A账户转出之后,突然无法连接数据库了,这样钱就不能转到B账户了,可是A的钱已经没了。所以我们应该把这两步看成是一个整体,要么同时成功,要么什么都不做。这就是事务了。
Java中是如何处理事务的呢?
我们从java.sql.Connection说起,Connection表示了一个和数据库的链接,可以通过Connection来对数据库操作。在通常情况是Connection的属性是自动提交的,也就是说每次的操作真的更新了数据库,真的无法回退了。针对上述的例子,一旦A账户的钱转出了,即对数据库进行了更新操作了,但是钱并没有转到B的账户,这笔钱就白白“不见”了。这并不是我们希望的。
我们希望的是:看起来成功了,但是没有真的操作数据库,知道我想让他真的发生。可以通过Connection的setAutoCommit(false)让Connection不自动提交你的数据,除非你真的想提交。那么如何让操作真的发生呢?可以使用Connection的commit方法。如何让操作回退呢?使用rollback方法。
例如: 
try{ 
Connection conn = getConnection(); // 不管如何我们得到了链接 
conn.setAutoCommit(false); 
// A账户转出
// B账户转入
conn.commit(); // 成功的情况下,提交更新。 
} catch(SQLException ex) { 
conn.rollback(); // 失败的情况下,回滚所有的操作 
} finally { 
conn.close();
这里有一点非常重要,事务是基于数据库链接的。所以在但数据库的情况下,事务操作很简单。 
那么如果表分布在两个不同的数据库中呢? 
例如订单表在订单库中,库存表在库存库中,那么我们如何处理这样的事务呢? 
需要注意,提交也可以遇到错误呀! 
try{ 
Connection conn1 = getConnection1(); 
Connection conn2 = getConnection2(); 
// 基于conn1做更新操作 
// 基于conn2做更新操作 
try{ 
conn1.commit() 
} catch(SQLExcetion ) { 
conn1.rollback(); 

try { 
conn2.commit(); 
} catch(SQLException ) { 
conn2.rollbakc(); 
// 保证务必将刚才的更新还原回来。 

} catch(SQLException ex) { 
// 如果更新失败,conn1.rollback 
// 如果更新失败,conn1.rollback && conn2.rollback 
} finally { 
conn1.close(); 
conn2.close(); 

看看上述的代码就知道,其实操作非常的复杂,甚至:保证肯定还原刚才更新的账户根本无法保证。
在上述情况下的事务可以称之为分布式事务,通过上述的代码中事务同时提交处理的部分我们可以得出,要想处理分布式事务,必须有独立于数据库的第三方的事务处理组件。 
幸运的是通常情况下,JavaEE兼容的应用服务器,例如:Weblogic,Websphere,JBoss,Glassfish等都有这种分布式事务处理的组件。 

如何使用应用服务器的分布式事务管理器处理分布式事务? 
以galssfish为例 
1 建立对应两个数据库的XA(javax.sql.XADataSource)类型的数据源。 
2 使用UserTransaction来保证分布式事务。 
try{ 
Connection conn1 = datasource1.getConnection(); 
Connection conn2 = datasource2.getConnection(); 
UserTransaction ut = getUserTransaction(); 
ut.begin(); 
// A账户转出
// B账户转入
ut.commit(); // 成功的情况下,提交更新。 
} catch(SQLException ex) { 
ut.rollback(); // 失败的情况下,回滚所有的操作 
} finally { 
conn.close(); 

如何获取UserTransaction呢?可以使用如下方法 
UserTransaction tx = (UserTransaction)  ctx.lookup("jndi/UserTransaction"); 

转载于:https://my.oschina.net/xiahuawuyu/blog/84691

简单的Java处理事务相关推荐

  1. java初学者指南_企业Java中事务隔离级别的初学者指南

    java初学者指南 介绍 基于ACID事务属性的关系数据库强一致性模型. 在本文中,我们将阐明对资源本地事务和JTA事务使用不同的事务隔离级别和各种配置模式的背后原因. 隔离和一致性 在关系数据库系统 ...

  2. 企业Java中事务隔离级别的初学者指南

    介绍 基于ACID事务属性的关系数据库强一致性模型. 在本文中,我们将阐明对资源本地事务和JTA事务使用不同的事务隔离级别和各种配置模式的背后原因. 隔离和一致性 在关系数据库系统中,原子性和持久性是 ...

  3. 什么叫事务?Java如何处理事务呢?

    什么叫事务?这些就是数据库特有的术语了.懒虫在这里口头解释:就是把多件事情当做一件事情来处理.也就是大家同在一条船上,要活一起活,要over一起over ! 我为什么要使用事务? 俺这里再举个很俗很俗 ...

  4. java你如何保证事务的完整性_基于Java工作事务提醒系统设计.doc

    基于Java工作事务提醒系统设计 基于Java工作事务提醒系统设计 摘要:为了减少工作遗漏和提高工作效率,在原有的办公信息管理基础上,应用Java编程技术和数据库技术,提出了工作事务提醒系统的设计思路 ...

  5. java jdbc事务_Java JDBC事务管理和保存点

    java jdbc事务 Transaction Management in java is required when we are dealing with relational databases ...

  6. Java中事务的处理全解析

    ava的事务处理,如果对数据库进行多次操作,每一次的执行或步骤都是一个事务.如果数据库操作在某一步没有执行或出现异常而导致事务失败,这样有的事务被执行有的就没有被执行,从而就有了事务的回滚,取消先前的 ...

  7. java JDBC事务和JTA事务详解

    什么是事务? 事务其实就是一套数据库操作集合,说到事务就不得不说它的四大特性(A C I D):原子性,一致性,隔离性,持久性.事务的原子性表示事务要么被全部执行,要么被全部不执行.如果事务下的子事务 ...

  8. JAVA分布式事务原理及应用(转)

    JAVA分布式事务原理及应用(转) 引言 JTA(Java Transaction API)允许应用程序执行分布式事务处理--在两个或多个网络计算机资源上访问并且更新数据.JDBC驱动程序的JTA支持 ...

  9. 编写运行最简单的java程序——使用记事本编写java程序

    编写运行最简单的java程序--使用记事本编写java程序 第一个java程序--使用记事本编辑 经过上篇文章的java环境搭建成功的小伙伴们可以在自己的计算机上编写属于自己的java程序了yo~ 还 ...

最新文章

  1. 安装Fedora 15后需做的25件事情
  2. html 一行显示边框线,HTML 网页中要显示出来一个虚线的边框 就是一行字在边框里面,那个边框是显示出来的,程式码应该怎么写?...
  3. SpringMVC-获得Restful风格的参数
  4. 时间格式化需要注意点不可使用本地时间
  5. QGraphicsView加入到布局,所在的窗口变大,视图和场景都变大,使场景中的矩形也变大
  6. 如何迅速分析出系统CPU的瓶颈在哪里?
  7. 使用Typescript开发(二)
  8. Sql Server系列:排序函数
  9. Cisco公司的CAR流量控制策略
  10. 图论及其应用 2012年 期末考试答案总结
  11. 电信跨域跨系统业务实践
  12. [自学考试] [02142数据结构导论] Part1 概论
  13. 盛唐领土争夺战读后感
  14. CSS display 属性详解
  15. 全球及中国大健康产业投资潜力与运营价值分析报告2022-2028年
  16. 有交互作用的正交设计
  17. 《悲惨世界》--[法]雨果
  18. Win7解决telnet不是内部或外部命令的方法
  19. 位(Bit)与字节(Byte)
  20. 乐学python公众号_乐的解释|乐的意思|汉典“乐”字的基本解释

热门文章

  1. java 实体 text字段,如何在Java中修剪对象的某些字段?
  2. MATLAB画图:改变坐标轴刻度的显示数值
  3. oracle手工快照,创建oracle快照的步骤
  4. matlab regress()
  5. 【 MATLAB 】信号处理工具箱之波形产生函数 rectpuls
  6. WPF中的动画——(二)From/To/By 动画
  7. SQL Server 2016 查询存储性能优化小结
  8. (十二)Flask 学习 —— 换装
  9. EXC_BAD_ACCESS错误
  10. 多媒体开发之--- live555 vs2010/vs2013下编译,使用,测试