jta mysql_JTA事务

JDBC和JTA事务区别

简单的说 jta是多库的事务 jdbc是单库的事务。

jdbc事务

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

自动提交:缺省是自动提交。一条对数据库的更新(增/删/改)代表一项事务操作,操作成功后,系统将自动调用commit()来提交,否则将调用rollback()来回滚。

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

try {

conn =DriverManager.getConnection(...);

conn.setAutoCommit(false);//禁止自动提交,设置回滚点

stmt = conn.createStatement();

stmt.executeUpdate(...); //数据库更新操作1

stmt.executeUpdate(...); //数据库更新操作2

conn.commit(); //事务提交

}catch(Exception ex) {

log.error(...);

try {

conn.rollback(); //操作不成功则回滚

}catch(Exception e) {

log.error(...);

}

}

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

jta事务

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

/** 支付订单处理 **/

@Transactional(rollbackFor = Exception.class)

public void completeOrder() {

orderDao.update(); // 订单服务本地更新订单状态

accountService.update(); // 调用资金账户服务给资金帐户加款

pointService.update(); // 调用积分服务给积分帐户增加积分

accountingService.insert(); // 调用会计服务向会计系统写入会计原始凭证

merchantNotifyService.notify(); // 调用商户通知服务向商户发送支付结果通知

}

其中调用了五个服务,这五个服务都通过RPC的方式调用。虽然方法中增加了@Transactional注解,但是由于采用调用了分布式服务,该事务并不能达到ACID的效果。

JTA(Java Transaction API)提供了跨数据库连接(或其他JTA资源)的事务管理能力。JTA事务管理则由JTA容器实现。一个JTA事务可以有多个参与者,而一个JDBC事务则被限定在一个单一的数据库连接。下列任一个Java平台的组件都可以参与到一个JTA事务中:JDBC连接、JDO PersistenceManager 对象、JMS 队列、JMS 主题、企业JavaBeans(EJB)等。

Spring+Atomikos实现JTA:

添加依赖:

com.atomikos

transactions-jdbc

4.0.4

org.aspectj

aspectjweaver

1.6.11

配置文件applicationContext-jta.xml:

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns:context="http://www.springframework.org/schema/context"

xmlns:aop="http://www.springframework.org/schema/aop"

xmlns:tx="http://www.springframework.org/schema/tx"

xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans-3.0.xsd

http://www.springframework.org/schema/aop

http://www.springframework.org/schema/aop/spring-aop-3.0.xsd

http://www.springframework.org/schema/tx

http://www.springframework.org/schema/tx/spring-tx-3.0.xsd

http://www.springframework.org/schema/context

http://www.springframework.org/schema/context/spring-context-3.0.xsd">

Dao层:

3d834d0fc41c

3d834d0fc41c

Service层:

@Override

public void addAndDel(MybtUser user) {

userMapper_main.insert(user);

userMapper_other.deleteByPrimaryKey(user.getId());

}

测试:

@Test

public void testJta() throws Exception{

MybtUser user = new MybtUser(5,3,"E");

userService.addAndDel(user);

}

把MQ也加入JTA事务:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值