JTA Transactions
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相关推荐
- 使用Atomikos Transactions Essentials实现多数据源JTA分布式事务--转载
原文:http://www.ite/topic/122700 9.17 update:使用NonXADataSourceBean. Mysql在5.0版本和Connecter/J5.0版本后提供了XA ...
- JBPM 4.3 + Spring 3 + jBoss + JPA + JTA
来源:http://captaincaveman.posterous.com/jbpm-43-spring-3-jboss-jpa-jta-configuration Many an hour was ...
- Tomcat 6 部署工程总结,使用JNDI数据源配置
工程需要用JNDI数据源方式部署到tomcat,参考网上文章后,经过配置测试,摸索出来了. 环境说明: 数据库:Oracle9i Web服务器:tomcat-6.0.33 tomcat启动方式 ...
- SpringBoot:常用属性汇总
2019独角兽企业重金招聘Python工程师标准>>> 可以在application.properties/application.yml文件中或作为命令行开关指定各种属性.本节提供 ...
- SpringBootStarter种类
Name Description spring-boot-starter 核心starter, 包括auto-configuration支持, logging和YAML 支持 spring-boot- ...
- Atomikos 中文说明文档【转】
Atomikos 翻译文档(英文文档来源:下载安装包中START_HERE.html) ----译者:周枫 请尊重劳动成果,转载请标明 ...
- spring Transaction Management --官方
原文链接:http://docs.spring.io/spring/docs/current/spring-framework-reference/html/transaction.html 12. ...
- Activiti-01
1, Activiti官网:http://www.activiti.org/ 主页可以看到jar包的下载. 2, 进入http://www.activiti.org/userguide/index. ...
- java quartz timer_Java定时器Quartz和Timer
Java定时器之Quartz 简介 官方说明 Quartz is a richly featured, open source job scheduling library that can be i ...
最新文章
- Quartz2D在项目中的实际使用
- 《系统集成项目管理工程师》必背100个知识点-30工作分解结构(WBS)分解形式
- Java SE 桌面可访问性
- Git之常见零碎问题的原因分析和解决方案
- 空间复杂度 用什么符号表示_什么是大O符号解释:时空复杂性
- python3.7.2安装与配置_python3.7.0 安装与配置
- centos7远程桌面端口_CentOS7启用远程桌面连接
- C语言一趟冒泡交换最小值,C语言单链表冒泡排序为啥以下代码实现不了?
- 1000道Python题库系列分享九(31道)
- 如何用2分钟做出一张拥有“黑洞”和“脑洞”的热力地图?
- 查看mysql 主从日志_MySQL 主从
- Java学习笔记:2021年12月31日下午-2022年1月1日上午
- 零拷贝、如何实现零拷贝、大文件如何传输
- 雪花算法-java实现
- 5941. 找出知晓秘密的所有专家
- 滴水逆向三期和中级和高期教程
- 有哪些适合练手的爬虫小项目?
- 抖音小程序可做类目--资讯
- Windows安装MySQL以及解决.dll文件缺失问题
- LeetCodeClassification---- No.1 分治--使用递归完成对一维数组的求和--递归法完成sum函数