JTA事务

JDBC和JTA事务区别
简单的说 jta是多库的事务 jdbc是单库的事务。

jdbc事务
JDBC事务由Connnection对象控制管理,也就是说,事务管理实际上是在JDBC Connection中实现。事务周期限于Connection的生命周期。java.sql.Connection提供了两种事务模式:自动提交和手工提交。

自动提交:缺省是自动提交。一条对数据库的更新(增/删/改)代表一项事务操作,操作成功后,系统将自动调用commit()来提交,否则将调用rollback()来回滚。
手工提交:通过调用setAutoCommit(false)来禁止自动提交。这样就可把多个数据库操作的表达式作为一个事务,在操作完成后调用commit()来进行整体提交,其中任何一个操作失败,都不会执行到commit(),并产生异常;此时可在异常捕获时调用rollback()进行回滚,以保持多次更新操作后,相关数据的一致性,示例如下:

JDBC 事务的一个缺点是事务的范围局限于一个数据库连接。一个JDBC事务不能跨越多个数据库。也无法在通过RPC的方式调用中保证事务。

jta事务
由于JDBC无法实现分布式事务。例如操作不同的数据库或MQ(MQ也可以认为是一个数据源),这时候就无法使用JDBC来管理事务:

其中调用了五个服务,这五个服务都通过RPC的方式调用。虽然方法中增加了@Transactional注解,但是由于采用调用了分布式服务,该事务并不能达到ACID的效果。
JTA(Java Transaction API)提供了跨数据库连接(或其他JTA资源)的事务管理能力。JTA事务管理则由JTA容器实现。一个JTA事务可以有多个参与者,而一个JDBC事务则被限定在一个单一的数据库连接。下列任一个Java平台的组件都可以参与到一个JTA事务中:JDBC连接、JDO PersistenceManager 对象、JMS 队列、JMS 主题、企业JavaBeans(EJB)等。
Spring+Atomikos实现JTA:
添加依赖:

配置文件applicationContext-jta.xml:

Dao层:

Service层:

测试:

把MQ也加入JTA事务:

这样消息监听器进行消息接收和对应的数据库访问就会处于同一数据库控制下,当消息接收失败或数据库访问失败都会进行事务回滚操作。当指定了transactionManager时,消息监听容器将忽略sessionTransacted的值。

发表回复