Java 事务精要

原创 2007年10月08日 21:50:00

简单事务的概念

我不想从原理上说明什么是事务,应为那太枯燥了。我只想从一个简单的例子来说明什么是事务。

 

例如我们有一个订单库存管理系统,每一次生成订单的同时我们都要消减库存。通常来说订单和库存在数据库里是分两张表来保存的:订单表,库存表。每一次我们追加一个订单实际上需要两步操作:在订单表中插入一条数据,同时修改库存的数据。

 

这样问题来了,例如我们需要一个单位为10的订单,库存中有30件,理想的操作是我们在订单表中插入了一条单位为10的订单,之后将库存表中的数据修改为20。但是有些时候事情并不是总是按照你的想法发生,例如:在你修改库存的时候,数据库突然由于莫名其妙的原因无法连接上了。也就是说库存更新失败了。但是订单已经产生了,那么怎么办呢?没办法,只有手动的修改。所以最好的方式是将订单插入的操作和库存修改的操作绑定在一起,必须同时成功或者什么都不做。这就是事务。

 

Java如何处理事务呢?

我们从java.sql.Connection说起,Connection表示了一个和数据库的链接,可以通过Connection来对数据库操作。在通常情况是Connection的属性是自动提交的,也就是说每次的操作真的更新了数据库,真的无法回退了。针对上述的例子,一旦库存更新失败了,订单无法回退,因为订单真的插入到了数据库中。这并不是我们希望的。

我们希望的是:看起来成功了,但是没有真的操作数据库,知道我想让他真的发生。可以通过Connection的setAutoCommit(false)让Connection不自动提交你的数据,除非你真的想提交。那么如何让操作真的发生呢?可以使用Connection的commit方法。如何让操作回退呢?使用rollback方法。

例如:

 

try{

    Connection conn = getConnection(); // 不管如何我们得到了链接

    conn.setAutoCommit(false);

    // 插入订单

    // 修改库存

    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();

   

    // 插入订单

    // 修改库存

    ut.commit();  // 成功的情况下,提交更新。

} catch(SQLException ex) {

    ut.rollback(); // 失败的情况下,回滚所有的操作

} finally {

   conn.close();

}

 

如何获取UserTransaction呢?可以使用如下方法

UserTransaction tx = (UserTransaction)
  ctx.lookup("jndi/UserTransaction");

 

 

JavaScript面向对象精要(一)

传统面向对象的语言几大特征:封装、继承、多态,在JavaScript中并不适用。JavaScript的弱类型特征允许你用比其他语言更少的代码完成同样的任务。无需提前设计好类再进行编码。需要一个具有某个...
  • ligang2585116
  • ligang2585116
  • 2017年01月08日 15:16
  • 3258

MongoDB管理与开发精要

逻辑结构 MongoDB逻辑结构是一种层次结构,主要由文档(document),集合(collection),数据库(database)三部分组成。 document相当关系数据库中的一行记录...
  • sgear
  • sgear
  • 2013年05月16日 16:26
  • 1097

≪统计学习精要(The Elements of Statistical Learning)≫课堂笔记(二)

继续一周一次的课堂笔记 :D 昨天去晚了站着听讲,感觉好好啊,注意各种集中。想想整个教室里面就是我和老师是站着的,自豪感油然而生。 第二次课讲的东西依旧比较简单,是这本书第二章的前半部分。作为...
  • mydear_11000
  • mydear_11000
  • 2016年11月28日 09:56
  • 299

Unity Shader入门精要读书笔记第一篇

渲染流水线 计算机需要从一系列的顶点数据,为力等信息处罚,将这些信息最终转换成一张人眼可以看到的图像。 这一渲染过程分成三个阶段: 1. 应用阶段 :有开发者主导的阶段。例如,开发者使用了哪些...
  • ndc1992
  • ndc1992
  • 2016年07月08日 10:55
  • 1012

《精要主义》读书笔记(一)

重要 必须做的事情其实并不多,如果把这些能够摘清楚,然后做好,看看效果如何?...
  • aomandeshangxiao
  • aomandeshangxiao
  • 2017年12月17日 21:40
  • 115

java事务 深入Java事务的原理与应用

java事务 深入Java事务的原理与应用 一、什么是JAVA事务     通常的观念认为,事务仅与数据库相关。     事务必须服从ISO/IEC所制定的ACID原则。ACI...
  • sinat_33536912
  • sinat_33536912
  • 2016年04月20日 14:34
  • 9252

Unity Shader入门精要笔记(三):Unity Shader数学基础

本系列文章由Aimar_Johnny编写,欢迎转载,转载请标明出处,谢谢。 http://blog.csdn.net/lzhq1982/article/details/73523986 说实话,我...
  • lzhq1982
  • lzhq1982
  • 2017年06月22日 12:08
  • 711

Unity Shader入门精要学习笔记 - 第7章 基础纹理

纹理最初的目的就是使用一张图片来控制模型的外观。使用纹理映射技术,我们可以把一张图“黏”在模型表面,逐纹素地控制模型的颜色。 在美术人员建模的时候,通常会在建模软件中利用纹理展开技术把纹理映射坐标存储...
  • u010848412
  • u010848412
  • 2017年06月03日 23:11
  • 1410

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

什么叫事务? 这些就是数据库特有的术语了。懒虫在这里口头解释:就是把多件事情当做一件事情来处理。也就是大家同在一条船上,要活一起活,要over一起over !    我为什么要使用事务? 俺这里...
  • u010337889
  • u010337889
  • 2014年09月19日 09:37
  • 6622

Java中事务的处理

原文链接:http://zhenchengchagangzi.iteye.com/blog/1159493 2013.8.29号在家时阿里巴巴的电话面试里面问了一个关于java 事务的问题,...
  • mukun060
  • mukun060
  • 2013年09月04日 15:33
  • 61504
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java 事务精要
举报原因:
原因补充:

(最多只允许输入30个字)