`
wuce7758
  • 浏览: 182234 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论
  • YTT1121: 有网络拓扑发现的源代码么?能不能发我一份学习一下,现在我正要做 ...
    java拓扑图
  • YTT1121: 大神,有网络拓扑发现的源代码么?或者您会编写么?我需要做科研改 ...
    java拓扑图
  • YTT1121: 大神,有网络拓扑发现的源代码么?或者您会编写么?我需要做科研改 ...
    java拓扑图
  • poettang: 求代码分享学习,谢谢!膜拜大神!258026921@qq.co ...
    java拓扑图
  • oiqio: 87836238@qq.com,感谢楼主,来一份~
    java拓扑图

Java 处理事务精要

阅读更多

简单事务的概念

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

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

  这样问题来了,例如我们需要一个单位为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"); 

分享到:
评论

相关推荐

    Java 面试 精要

    虽然标签中未直接提及,但Java开发中往往需要与数据库交互,因此SQL查询能力、事务管理、JDBC API使用和NoSQL数据库的基本概念也是面试中可能涉及的内容。 以上就是Java面试精要的主要知识点,这些内容不仅适用于...

    J2EE开源编程精要15讲 源代码(全部)

    6. **Java Persistence API (JPA)**:JPA是ORM(对象关系映射)的标准,用于处理数据库操作。源代码可能使用Hibernate或EclipseLink等JPA实现,展示了如何定义实体类,如何配置映射,以及如何执行CRUD操作。 7. **...

    java实用教程

    2. **Java EE(企业版)**:专为企业级应用设计,包括Web服务、事务处理和集群支持等功能。 3. **Java ME(微型版)**:针对资源受限的设备,如移动设备和嵌入式系统,提供轻量级Java运行环境。 #### 六、Java开发...

    J2EE 开源编程精要15讲 源代码

    9. **JTA(Java Transaction API)**:JTA用于管理跨越多个资源的事务,确保数据一致性。 10. **JPA(Java Persistence API)**:JPA是另一种ORM规范,提供了统一的方式来管理Java对象和关系数据库之间的映射。它...

    J2EE开源编程精要15讲源代码part2

    《J2EE开源编程精要15讲》是一本深入探讨Java企业级应用开发的教程,专注于使用开源技术栈进行Web开发。这部分源代码(part2)是该教程的实践部分,涵盖了Eclipse、Struts、Hibernate和Spring这四大核心技术的集成与...

    计算机专业复试面试习题精要.zip

    7. **数据库**:SQL语言,关系数据库模型,事务处理,索引等。 8. **理论知识**:计算理论,如图灵机、复杂度理论等。 9. **面试技巧**:如何有效表达自己,解决问题的思维过程,如何应对压力和不确定性。 这个...

    java面试理论

    ### Java面试理论精要 #### 栈与队列的区别 栈和队列是两种常见的数据结构,它们在Java面试中经常被提及。栈遵循后进先出(LIFO,Last In First Out)的原则,这意味着最后一个进入栈的元素将是第一个被移除的。栈...

    Java知识总结

    ### Java知识精要详解 #### 一、Java的起源与特性 ##### 1. Java的历史背景 Java源自SUN公司的GREEN项目,最初的目标是为家用消费电子产品创建一个分布式代码系统,以便通过发送信息来控制各类电器如电视和冰箱。...

    基于java的职工考勤管理信息系统.doc

    该系统旨在提升工作效率,规范考勤管理,帮助用户轻松处理员工的出勤、请假、出差、加班等事务。 在系统设计中,首先需要了解并掌握Java编程基础,包括面向对象的编程概念、类和对象的创建、异常处理、IO流等。同时...

    JavaTutorial-master

    《Java编程精要详解》 Java,这门广泛使用的编程语言,自1995年发布以来,就以其“一次编写,到处运行”的跨平台特性赢得了开发者们的喜爱。本教程“JavaTutorial-master”旨在深入浅出地讲解Java的核心概念和技术...

    Java_Advanced_journal

    《Java高级技术精要》 Java作为一种广泛应用的编程语言,其高级特性对于开发者来说是提升技能、优化代码的关键。在“Java_Advanced_journal”中,我们深入探讨了Java的高级主题,旨在帮助开发者掌握更复杂、高效的...

    iBase4J-iBase4J-develop.zip

    《Java开发精要:以iBase4J框架为例》 在IT行业中,Java语言以其卓越的跨平台性能、丰富的库支持以及强大的社区生态,成为众多企业和开发者首选的开发语言之一。iBase4J,作为一款基于Java的企业级开发框架,为...

    清晰的技术资料学习笔记

    EJB提供了一种标准的方式来处理分布式系统中的事务、安全性和并发问题。学习EJB意味着要掌握实体bean、会话bean和消息驱动bean的使用。 最后,ECLIPSE是一个强大的集成开发环境(IDE),支持多种编程语言,包括JAVA...

    practical.rar

    除了这些核心技术,JavaWeb应用还会涉及到其他的组件,如JNDI(Java Naming and Directory Interface)用于服务定位,JTA(Java Transaction API)处理事务管理,以及JMS(Java Message Service)实现异步通信。...

    JMS简明教程

    此外,JMS还可以与JTA(Java Transaction API)结合,以确保消息处理的事务一致性。 #### JMS1.1新特性 JMS1.1版本相比早期版本,增加了对消息持久性的支持,使得消息即使在消息中间件重启后仍然能够被正确处理。...

    javaInterviewGuideMaster.rar

    《Java面试指南精要》 在Java开发领域,面试是检验开发者技能和知识深度的关键环节。这份"javaInterviewGuideMaster.rar"压缩包包含了全面的Java中高级开发工程师面试准备资料,旨在帮助求职者掌握核心要点,顺利...

    dsdeliver-sds

    在"dsdeliver-sds"项目中,Java可能是实现核心逻辑的主要工具,用于处理数据处理、存储、检索和传输等功能。 2. **模块化开发**: "dsdeliver-sds-main"可能是一个Maven或Gradle项目的主模块,这表明项目遵循模块化...

    Hibernate_教程

    事务处理是数据持久化过程中不可或缺的部分,Hibernate提供了内置的事务管理机制,允许开发者在Session和事务范围内执行数据操作。此外,Hibernate还支持乐观并发控制和悲观锁,以确保在多用户环境中数据的一致性和...

Global site tag (gtag.js) - Google Analytics