JTA : Java Transaction API

界定事务的方式与事务管理器的实现无关

允许分布式事务处理。

JTA transaction允许访问多个数据库,通常的DBMS transaction是不允许的。

JTA transaction不允许nested transaction。

JTS : Java Transaction Service

GlassFish提供了包含JTS的事务管理器实现。但用户不会直接调用JTS,而是调用JTA,由JTA来调用更低层的JTS。


distributed transaction 包含:

一个transaction manager

事务管理器: 管理所有事务参与者之间的通信。

一个或多个resource manager

资源管理器: 持久化数据存储。

JTA与JDBC

JTA事务可以有多个参与者,参与者可以是 : JDBC连接、JDO PersistenceManager对象、JMS队列、JMS主题、EJB、J2EE Connector Architecture规范的资源分配器。

JDBC事务只能有一个参与者 : 一个JDBC连接,不能多个数据库。

两种模式:自动提交(default)、手动提交。

javax.transaction.UserTransaction

JTA来处理事务用到的Java类

更新多个数据库

JavaEE容器会管理所有的EJB事务,除了Bean-Managed JDBC事务。?

JavaEE事务管理器允许在同一个事务中,更新多个数据库。

(1) 在同一个JavaEE容器中

其中,Bean-A负责begin,end,所有X、Y、Z的操作在同一个事务中。

(2)在不同的JavaEE容器中

也是在同一个事务中,由JavaEE事务管理器们保证这一点。

JDBC事务示例代码:

package test.xue.transaction;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;/*** database : transaction* table : message(title)* table : balance(user, balance)*/
public class JDBCTransaction {public static Connection getConnection() throws Throwable {Class.forName("com.mysql.jdbc.Driver");Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/transaction", "root", "root");return conn;}public void autoCommit() throws Throwable {Connection conn = JDBCTransaction.getConnection();Statement stmt = conn.createStatement();// default autoCommitstmt.executeUpdate("insert into message values('hello world')");conn.close();}public void noAutoCommit() throws Throwable {Connection conn = JDBCTransaction.getConnection();conn.setAutoCommit(false);String user1 = "Lily", user2 = "Lucy";int count = 123;Statement stmt = conn.createStatement();try {// begin a transactionint updated = stmt.executeUpdate("update balance set balance=balance-"+ count + " where user='" + user1 + "'");if (updated == 0) {throw new SQLException(user1 + " not exists");}updated = stmt.executeUpdate("update balance set balance=balance+"+ count + " where user='" + user2 + "'");if (updated == 0) {throw new SQLException(user1 + " not exists");}conn.commit();// end the transaction} catch (Throwable e) {// when exception occurs, rollback allconn.rollback();e.printStackTrace();}conn.close();}public static void main(String[] args) throws Throwable {JDBCTransaction jdbc = new JDBCTransaction();jdbc.autoCommit();jdbc.noAutoCommit();}
}

JTA事务:

JDBC驱动: javax.sql. XADataSource, XAConnection, XAResource

XAConnection与Connection的区别为: XAConnection可以用在JTA事务中,且不支持自动提交。

package test.xue.transaction;import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;import javax.sql.XAConnection;
import javax.sql.XADataSource;
import javax.transaction.xa.XAException;
import javax.transaction.xa.XAResource;import com.mysql.jdbc.jdbc2.optional.MysqlXADataSource;
import com.mysql.jdbc.jdbc2.optional.MysqlXid;public class JTATransaction {public XADataSource getDataSource() {MysqlXADataSource ds = new MysqlXADataSource();ds.setServerName("localhost");ds.setPortNumber(3306);ds.setDatabaseName("transaction");return ds;}public void testJTA() throws SQLException, XAException {XADataSource ds = getDataSource();XAConnection xaconn = ds.getXAConnection("root", "root");Connection conn = xaconn.getConnection();Statement stmt = conn.createStatement();XAResource res = xaconn.getXAResource(); // for mysql-connector-java-5.1.21-bin.jar, return xaconn itselfMysqlXid xid = new MysqlXid(new byte[] { 11 }, new byte[] { 22 }, 99);res.start(xid, XAResource.TMNOFLAGS);stmt.executeUpdate("insert into message values('hello JTA')");res.end(xid, XAResource.TMSUCCESS);int ret = res.prepare(xid);if (ret == XAResource.XA_OK) {res.commit(xid, false);}stmt.close();conn.close();xaconn.close();}public static void main(String[] args) throws SQLException, XAException {JTATransaction jta = new JTATransaction();jta.testJTA();}
}

其中,Xid的两个参数分别为:全局事务Id,分支事务Id。

此例子中没有用到事务管理器与资源管理器,也没有用到分布式事务和多个数据库,只是最简单的介绍JTA事务。

关于两阶段提交协议,以后再说吧。

Link : http://walsh.iteye.com/blog/258002

JTA Transactions相关推荐

  1. 使用Atomikos Transactions Essentials实现多数据源JTA分布式事务--转载

    原文:http://www.ite/topic/122700 9.17 update:使用NonXADataSourceBean. Mysql在5.0版本和Connecter/J5.0版本后提供了XA ...

  2. JBPM 4.3 + Spring 3 + jBoss + JPA + JTA

    来源:http://captaincaveman.posterous.com/jbpm-43-spring-3-jboss-jpa-jta-configuration Many an hour was ...

  3. Tomcat 6 部署工程总结,使用JNDI数据源配置

    工程需要用JNDI数据源方式部署到tomcat,参考网上文章后,经过配置测试,摸索出来了.     环境说明: 数据库:Oracle9i Web服务器:tomcat-6.0.33 tomcat启动方式 ...

  4. SpringBoot:常用属性汇总

    2019独角兽企业重金招聘Python工程师标准>>> 可以在application.properties/application.yml文件中或作为命令行开关指定各种属性.本节提供 ...

  5. SpringBootStarter种类

    Name Description spring-boot-starter 核心starter, 包括auto-configuration支持, logging和YAML 支持 spring-boot- ...

  6. Atomikos 中文说明文档【转】

    Atomikos 翻译文档(英文文档来源:下载安装包中START_HERE.html)                                  ----译者:周枫 请尊重劳动成果,转载请标明 ...

  7. spring Transaction Management --官方

    原文链接:http://docs.spring.io/spring/docs/current/spring-framework-reference/html/transaction.html 12.  ...

  8. Activiti-01

    1, Activiti官网:http://www.activiti.org/  主页可以看到jar包的下载. 2, 进入http://www.activiti.org/userguide/index. ...

  9. java quartz timer_Java定时器Quartz和Timer

    Java定时器之Quartz 简介 官方说明 Quartz is a richly featured, open source job scheduling library that can be i ...

最新文章

  1. Quartz2D在项目中的实际使用
  2. 《系统集成项目管理工程师》必背100个知识点-30工作分解结构(WBS)分解形式
  3. Java SE 桌面可访问性
  4. Git之常见零碎问题的原因分析和解决方案
  5. 空间复杂度 用什么符号表示_什么是大O符号解释:时空复杂性
  6. python3.7.2安装与配置_python3.7.0 安装与配置
  7. centos7远程桌面端口_CentOS7启用远程桌面连接
  8. C语言一趟冒泡交换最小值,C语言单链表冒泡排序为啥以下代码实现不了?
  9. 1000道Python题库系列分享九(31道)
  10. 如何用2分钟做出一张拥有“黑洞”和“脑洞”的热力地图?
  11. 查看mysql 主从日志_MySQL 主从
  12. Java学习笔记:2021年12月31日下午-2022年1月1日上午
  13. 零拷贝、如何实现零拷贝、大文件如何传输
  14. 雪花算法-java实现
  15. 5941. 找出知晓秘密的所有专家
  16. 滴水逆向三期和中级和高期教程
  17. 有哪些适合练手的爬虫小项目?
  18. 抖音小程序可做类目--资讯
  19. Windows安装MySQL以及解决.dll文件缺失问题
  20. LeetCodeClassification---- No.1 分治--使用递归完成对一维数组的求和--递归法完成sum函数

热门文章

  1. 机器学习 学习曲线 Python实现学习曲线及案例解析
  2. 读书笔记——《腾讯传》
  3. MoveWindow的问题
  4. HMI-8-[Qt 播放GIF动画]:启动画面的实现
  5. Crosby质量箴言(转)
  6. 【BC史上最大灾难】一场被我搞砸了的BC
  7. ZOJ 3885 The Exchange of Items
  8. linux gid 含义,Linux系统UID和GID详解
  9. Ubuntu下MongoDB的安装与使用(离线安装方式|非apt-get)
  10. 2023年高考倒计时还有几天?支持计算倒计时天数的备忘录