SpringMVC+MyBatis 事务管理一
2021-02-20 15:20
标签:事务管理 源码 public ack use manage 手动 sys aci spring事务管理包含两种情况,编程式事务、声明式事务。而声明式事务又包括基于注解@Transactional和tx+aop的方式。那么本文先分析编程式注解事务和基于注解的声明式事务。 编程式事务管理使用TransactionTemplate或者PlatformTransactionManager。对于编程式事务spring推荐使用TransactionTemplate。 spring事务特性 spring中所有的事务策略类都继承自org.springframework.transaction.PlatformTransactionManager接口 编程式事务TransactionTemplate需要手动在代码中处理事务,一般不推荐使用,也不符合spring的思想,因为它直接耦合代码,但各有利弊。先看下TransactionTemplate的源码。 从上面的代码可以看到核心方法是execute,该方法入参TransactionCallback 那么以上两个源码可以确定我们使用编程式事务管理的方式也就是自己需要重写doInTransaction()。OK,那么我们手动使用TransactionTemplate处理下。 1、先配置transactionmanager 2、配置transactionTemplate 3、业务代码处理 业务代码中我们使用by zero的异常故意抛出,你会发现能继续打印success,当你断点debug时,你会发现数据库一直是锁定状态,直到你程序执行完。如下图: 二、基于Transactional注解的事务管理 当前应该是使用最清爽的事务管理方式了,也符合spring的理念,非入侵代码的方式。 1、配置 2、配置后只需要在要处理的地方加上Transactional注解,而且Transactional注解的方式可以应用在类上,也可以应用在方法上,当然只针对public方法。 3、业务代码处理 https://www.cnblogs.com/sword-successful/p/7274929.html http://www.cnblogs.com/wyisprogramming/p/6944878.html http://www.cnblogs.com/xusir/p/3650522.html Q1.元素 "mvc:annotation-driven" 的前缀 "mvc"未绑定 办法:在spring-servlet.xml文件里使用 Q2.通配符的匹配很全面, 但无法找到元素 ‘mvc:annotation-driven‘ 的声明 原因是:虽然在xml文件上方声明了mvc,但没有配置此声明对应的文件信息,正确配置如下: 意思就是,mvc声明用http://www.springframework.org/schema/mvc/spring-mvc.xsd这个文件来解析 https://blog.csdn.net/chanewx/article/details/57397360 SpringMVC+MyBatis 事务管理一 标签:事务管理 源码 public ack use manage 手动 sys aci 原文地址:https://www.cnblogs.com/roak/p/12681106.html前言
一、编程式事务
public interface PlatformTransactionManager {
TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException;
void commit(TransactionStatus status) throws TransactionException;
void rollback(TransactionStatus status) throws TransactionException;
}
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
.transactionManager = transactionManager;
}
public
PlatformTransactionManager getTransactionManager() {
return
this
.transactionManager;
}
@Override
public
void
afterPropertiesSet() {
if
(
this
.transactionManager ==
null
) {
throw
new
IllegalArgumentException(
"Property ‘transactionManager‘ is required"
);
}
}
@Override
public
throws
TransactionException {
if
(
this
.transactionManager
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 exception"
, ex);
ex2.initApplicationException(ex);
throw
ex2;
}
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;
}
}
}
public
interface
TransactionCallback
T doInTransaction(TransactionStatus status);
}
@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;
}
@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项目中配置xml时一些和命名空间相关的问题,如mvc:annotation-driven的前缀 "mvc"未绑定
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd ">
下一篇:python列表和元组的操作