`
- 浏览:
100166 次
- 性别:
- 来自:
北京
-
最简单的Java处理事务
(作者:javadt.com)
用一个简单的例子来说明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");
转载请注明:转自http://javadt.com
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
### Java事务处理总结 #### 一、什么是Java事务 事务是指一组操作的集合,这些操作要么全部成功,要么全部失败,以确保数据的一致性和完整性。在Java开发中,事务处理主要关注的是如何管理和控制对数据库的操作,...
### Java事务处理详解 在Java开发中,事务处理是一项至关重要的技术,特别是在涉及数据库操作时。本文将全面阐述Java中的事务处理过程与方法,并通过具体的示例代码来帮助读者更好地理解这一概念。 #### 一、Java...
在Java中,事务处理通常与数据库操作密切相关,尤其是通过JDBC(Java Database Connectivity)进行的数据库交互。 1. **原子性**:事务中的每个操作要么全部完成,要么全部不完成。如果在事务执行过程中发生错误,...
3. “全局事务+多sessionFactory”:这是处理最复杂情况的配置,如大型分布式系统或微服务架构。每个sessionFactory对应一个数据源,全局事务确保所有数据源的操作在同一个事务中完成,确保数据一致性。 理解并熟练...
"Java实现的mysql事务处理操作示例" 本文主要介绍了Java实现的mysql事务处理操作,结合实例形式较为详细的分析了Java基于JDBC操作mysql数据库实现事务处理的相关概念、操作技巧与注意事项。 事务处理是数据库操作...
### Java事务设计策略知识点概述 #### 一、事务模型分类 根据给定文件中的描述,事务模型主要可以分为三类: 1. **本地事务模式**:这种模式适用于单个资源的事务管理,例如单一数据库连接的事务处理。在这种模式...
分布式数据库事务处理是数据库系统中的一个重要概念,尤其是在大型企业级应用和互联网服务中,它能够保证数据的一致性和完整性,即使在多台计算机之间进行数据操作。COM+(Component Object Model Plus)是微软提出...
在Java中,事务可以通过多种方式实现,其中最常见的是使用JDBC(Java Database Connectivity)和JTA(Java Transaction API)。 ##### 3.1 使用JDBC管理事务 JDBC提供了基本的事务管理功能,可以通过设置连接的`...
6. **Transaction管理**:数据库操作通常涉及事务,需要使用Session的beginTransaction()、commit()和rollback()方法来控制事务的边界。 7. **Criteria查询**或**HQL(Hibernate Query Language)**:除了使用原生...
在Java编程中,事务处理是确保数据库操作的原子性、一致性、隔离性和持久性的关键机制。JDBC(Java Database Connectivity)提供了对事务处理的基本支持,而JTA(Java Transaction API)则提供了更高级的事务管理...
综上所述,这个简单的学生管理系统结合了Java语言的面向对象编程、输入输出、异常处理和GUI构建,以及数据库的连接、SQL操作和事务处理等多个重要知识点。通过实践这样的项目,开发者可以提升对Java编程和数据库管理...
通过以上内容,我们可以看到JOTM源码的深入学习不仅可以提升Java事务处理技术,还能增强对分布式系统设计的理解,这对于成为一名资深的Java开发工程师至关重要。同时,这也会让你在面对复杂的企业级问题时更有信心和...
### Java Transaction ...通过学习《Java Transaction Design Strategies》,读者可以全面了解Java事务处理的核心概念和技术细节,掌握设计高效、可靠的事务管理方案的方法,从而有效提升软件系统的整体性能和稳定性。
支付宝的分布式处理方案与大规模SOA系统中的分布事务处理是一篇深入探讨分布式系统中事务处理技术的文档。文档中详细阐述了分布式事务的历史背景、面临的挑战、基本原则和模式、以及具体的实施框架和设施。 分布式...
总之,Java事务是确保数据库操作安全性和一致性的关键机制,通过不同类型的事务管理方式,开发者可以选择最适合其应用场景的策略。无论是简单的JDBC事务,还是复杂的JTA事务或容器事务,都旨在为Java应用提供可靠的...
在SSH整合中,Hibernate作为数据访问层,处理数据库的CRUD(创建、读取、更新、删除)操作,Spring通过其JDBC模板或者HibernateTemplate对Hibernate进行进一步的封装和管理,简化了事务处理。 整合SSH框架的过程中...
本篇文章将深入探讨SSH框架的核心概念、功能及其在Java应用中的简单应用。 首先,Spring框架是SSH中的核心,它提供了一个全面的编程和配置模型,用于构建现代Java应用程序。Spring的主要特点包括依赖注入(DI)、...
在Java编程语言中,增删改...同时,事务管理、错误处理和异常捕获也是在实际开发中必不可少的部分,它们确保了数据的一致性和程序的稳定性。对于初学者来说,理解并熟练掌握这些基本操作是迈进Java数据库编程的第一步。
JDBC是Java中访问数据库的标准API,允许开发者执行SQL语句、获取结果集并处理数据库事务。在信息管理系统中,开发者可能会创建一个`DataSource`来连接数据库,然后通过`Connection`、`Statement`或`...