java 编程式事务实例_SpringMVC+MyBatis 事务管理(实例)

前言

spring事务管理包含两种情况,编程式事务、声明式事务。而声明式事务又包括基于注解@Transactional和tx+aop的方式。那么本文先分析编程式注解事务和基于注解的声明式事务。 编程式事务管理使用TransactionTemplate或者PlatformTransactionManager。对于编程式事务spring推荐使用TransactionTemplate。

一、编程式事务

spring事务特性

spring中所有的事务策略类都继承自org.springframework.transaction.PlatformTransactionManager接口

public interface PlatformTransactionManager {

TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException;

void commit(TransactionStatus status) throws TransactionException;

void rollback(TransactionStatus status) throws TransactionException;

}

编程式事务TransactionTemplate需要手动在代码中处理事务,一般不推荐使用,也不符合spring的思想,因为它直接耦合代码,但各有利弊。先看下TransactionTemplate的源码。

public class TransactionTemplate extends DefaultTransactionDefinition

implements TransactionOperations, InitializingBean {

protected final Log logger = LogFactory.getLog(getClass());

private PlatformTransactionManager transactionManager;

public TransactionTemplate() {

}

public TransactionTemplate(PlatformTransactionManager transactionManager) {

this.transactionManager = transactionManager;

}

public TransactionTemplate(PlatformTransactionManager transactionManager, TransactionDefinition transactionDefinition) {

super(transactionDefinition);

this.transactionManager = transactionManager;

}

public void setTransactionManager(PlatformTransactionManager transactionManager) {

this.transactionManawww.cppcns.comransactionManager instanceof CallbackPreferringPlatformTransactionManager) {

return ((CallbackPreferringPlatformTransactionManager) this.transactionManager).execute(this, action);

}

else {

TransactionStatus status = this.transactionManager.getTransaction(this);

T result;

try {

result = action.doInTransaction(status);

}

catch (RuntimeException ex) {

// Transactional code threw application exception -> rollback

rollbackOnException(status, ex);

throw ex;

}

catch (Error err) {

// Transactional code threw error -> rollback

rollbackOnException(status, err);

throw err;

}

catch (Throwable ex) {

// Transactional code threw unexpected exception -> rollback

rollbackOnException(status, ex);

throw new UndeclaredThrowableException(ex, "TransactionCallback threw undeclared checked exception");

}

this.transactionManager.commit(status);

return result;

}

}

private void rollbackOnException(TransactionStatus status, Throwable ex) throws TransactionException {

logger.debug("Initiating transaction rollback on application exception", ex);

try {

this.transactionManager.rollback(status);

}

catch (TransactionSystemException ex2) {

logger.error("Application exception overridden by rollback exceptiowww.cppcns.com

}

catch (RuntimeException ex2) {

logger.error("Application exception overridden by rollback exception", ex);

throw ex2;

}

catch (Error err) {

logger.error("Application exception overridden by rollback error", ex);

throw err;

}

}

}

从上面的代码可以看到核心方法是execute,该方法入参TransactionCallback。查看TransactionCallback源码:

public interface TransactionCallback {

T doInTransaction(TransactionStatus status);

}

那么以上两个源码可以确定我们使用编程式事务管理的方式也就是自己需要重写doInTransaction()。OK,那么我们手动使用TransactionTemplate处理下。

1、先配置transactionmanager

2、配置transactionTemplate

class="org.springframework.transaction

3、业务代码处理

@Autowired

private TransactionTemplate transactionTemplate;

public int insertUser2(final User user) {

Integer i= (Integer) this.transactionTemplate.execute(new TransactionCallback() {

public Object doInTransaction(TransactionStatus transactionStatus) {

int i = userMapper.insertUser(user);

if (i > 0) {

System.out.println("success");

}

int j = 10 / 0;

return i;

}

});

return i;

}

业务代码中我们使用by zero的异常故意抛出,你会发现能继续打印success,当你断点debug时,你会发现数据库一直是锁定状态,直到你程序执行完。如下图:

93589276349cf573a2bb546ed16b8d28.png

二、基于Transactional注解的事务管理

当前应该是使用最清爽的事务管理方式了,也符合spring的理念,非入侵代码的方式。

1、配置

2、配置后只需要在要处理的地方加上Transactional注解,而且Transactional注解的方式可以应用在类上,也可以应用在方法上,当然只针对public方法。

3、业务代码处理

@Transactional

public int insertUser(User user) {

int i = userMapper.insertUser(user);

if (i > 0) {

System.out.println("success");

}

int j = 10 / 0;

return i;

}

总结

以上所述是小编给大家介绍的SpringMVC+MyBatis 事务管理,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

本文标题: SpringMVC+MyBatis 事务管理(实例)

本文地址: http://www.cppcns.com/ruanjian/java/198492.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值