spring为了实现事务管理,为不同的dataSource提供不同的transactionManager.
transactionManager的顶层接口是PlatformTransactionManager
,抽象层为AbstractPlatformTransactionManager,
为hibernate提供了HibernateTransactionManager,
为jpa提供了JpaTransactionManager,
为jdbc提供的DataSourceTransactionManager
TransactionTemplate类持有了transactionManager,我们可以直接拿TransactionTemplate来实现我们的编程式事务管理.声明式的事务管理也是通过TransactionTemplate来实现的
TransactionTemplate类主要是用来做编程式事务管理的,可以实现代码级别粒度的事务控制,对于声明式事务管理,则不需要用TransactionTemplate,而是用spring官方提供的拦截器TransactionInterceptor,配合BeanNameAutoProxyCreator,可以快速构建出针对方法级别粒度的事务控制.
spring中的事务管理,看这一篇就够了
https://blog.csdn.net/lovesomnus/article/details/52619702
分享下,我再项目中如何使用编程式事务管理的
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
<description>数据源及事务配置</description>
<!-- 数据源配置 -->
<!-- 代理datasource,使其能够显式获取preparedStatement的参数值 -->
<bean id="proxyDataSource" class="org.jdbcdslog.ConnectionPoolDataSourceProxy">
<property name="targetDSDirect" ref="dataSource"/>
</bean>
<!-- 配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="proxyDataSource" />
</bean>
<!--事务模板 -->
<bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">
<property name="transactionManager" ref="transactionManager"/>
<!--ISOLATION_DEFAULT 表示由使用的数据库决定 -->
<property name="isolationLevelName" value="ISOLATION_DEFAULT"/>
<property name="propagationBehaviorName" value="PROPAGATION_REQUIRED" />
<!-- <property name="timeout" value="30"/> -->
</bean>
<!--配置其他事务传播特性的事务模板-->
<bean id="transactionTemplateRequireNew"
class="org.springframework.transaction.support.TransactionTemplate">
<property name="transactionManager" ref="iregulationTransactionManager"/>
<property name="propagationBehaviorName" value="PROPAGATION_REQUIRES_NEW"/>
</bean>
<!--配置摘要日志拦截器-->
<bean id="dalDigestAutoProxyCreator" class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<property name="interceptorNames">
<list><value>dalDigestLogInterceptor</value></list>
</property>
<property name="beanNames">
<value>*DAO</value>
</property>
</bean>
<bean id="dalDigestLogInterceptor" class="com.iregulation.common.dal.interceptor.DalDigestLogInterceptor" />
</beans>
/**
* DAL层摘要日志拦截器
* @author
* @version $Id: DalDigestLogInterceptor.java, v 0.1 2018年06月01日 12:38 wb-zzy353427 Exp $
*/
public class DalDigestLogInterceptor implements MethodInterceptor {
/** 摘要日志 */
private static final Logger DAL_DIGEST_LOGGER = LoggerFactory.getLogger("DAL-DIGEST");
/** 摘要日志的内容分隔符 */
private static final String SEP = ",";
/** 摘要日志中NULL内容的替代福 */
private static final String NULL_REPLACE = "-";
/** 摘要日志中DO对象的替代福 */
private static final String DO_REPLACE = "*";
@Override
public Object invoke(MethodInvocation invocation) throws Throwable {
// 被拦截的DAO方法
Method method = invocation.getMethod();
// 被拦截方法签名:"类名.方法名"
String invocationSignature = method.getDeclaringClass().getSimpleName() + "."
+ method.getName();
// DAO执行是否成功
boolean isSucess = true;
long startTime = System.currentTimeMillis();
try {
return invocation.proceed();
} catch (Exception e) {
isSucess = false;
throw e;
} finally {
try {
long elapseTime = System.currentTimeMillis() - startTime;
LoggerUtil.info(
DAL_DIGEST_LOGGER,
buildDigestLog(invocationSignature, isSucess, elapseTime,
invocation.getArguments()));
} catch (Exception e) {
LoggerUtil.error(e, "记录dal摘要日志出错");
}
}
}
/**
*
* @param invocationSignature 方法签名
* @param isSucess 执行是否成功
* @param elapseTime 耗时
* @param arguments 起始时间
* @return
*/
private Object buildDigestLog(String invocationSignature, boolean isSucess, long elapseTime,
Object[] arguments) {
StringBuilder sb = new StringBuilder();
sb.append("[");
{
//打印主体信息
sb.append("(");
// 调用方法签名:"系统名.方法名"
sb.append(invocationSignature).append(SEP);
// 方法执行是否成功
sb.append(isSucess ? "Y" : "N").append(SEP);
// 方法耗时
sb.append(elapseTime).append("ms");
sb.append(")");
}
if (arguments != null) {
// 打印参数信息
sb.append("(");
for (Object arg : arguments) {
if (arg == null) {
arg = NULL_REPLACE;
}
if (StringUtil.contains(arg.getClass().getSimpleName(), "DO")) {
arg = DO_REPLACE;
}
sb.append(arg).append(SEP);
}
if (arguments.length > 0) {
sb.deleteCharAt(sb.length() - 1);
}
sb.append(")");
}
sb.append("]");
return sb.toString();
}
}
TransactionTemplate的使用方法,可以参考,<设计模式>中的模板方法模式: https://www.jianshu.com/p/7e6b227ccae3
网友评论