本篇文章只涉及spring事务的配置,不进行事务的介绍。

spring通过PlatformTransactionManager接口作为事务管理器来进行事务的管理,它本身并不进行事务的创建以及相关操作,它就相当于事务管理的容器,里面放的是事务。事务使用有编程式事务和声明式事务,现在一般情况下都是使用声明式事务。

声明式事务使用方法:

1、在配置的xml文件中使用AOP模式来进行事务声明,如下所示

    <bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="interceptorPointCut"
expression="execution(* com.test.service.impl.*.*(..))" />
<aop:advisor advice-ref="txAdvice" pointcut-ref="interceptorPointCut" />
</aop:config>

2、使用注解形式进行事务声明,如下所示:

第一步:在xml配置文件中加入如下配置

<!-- 启动声明式注解 -->
<tx:annotation-driven transaction-manager="transactionManager" />

或者在被@configuration注解注释的类上添加@EnableTransactionManagement注解

第二步:在需要添加事务的类或方法上添加@Transactional注解,注解可以设置value(用来设置数据源)、transactionManager(同value作用相同)、propagation(设置事务的传播行为,使用枚举Propagation来选择值,默认是REQUIRED)、isolation(设置事务的隔离机制,使用枚举Isolation来选择值,默认是底层数据库支持的事务的默认隔离机制)、timeout(设置事务的超时时间,可以使用TransactionDefinition接口提供的值,默认值为-1)、readOnly(布尔值,设置事务为只允许读,不进行修改操作,如果是只有读的操作可以设置为true,官方解释设置为true时,会在运行时进行相应的优化,但是并不能保证进行修改操作会失败)、rollbackFor(设置进行事务回滚的异常类类型)、rollbackForClassName(设置进行事务回滚的异常类类名)、noRollbackFor(设置不会进行事务回滚的异常类类型)、noRollbackForClassName(设置不会进行事务回滚的异常类类名)

即使没有设置rollbackFor、rollbackForClassName的值,spring框架在我们调用的方法发生运行时异常的时候会进行事务回滚操作。

3、利用AOP的around类型的advice进行事务声明,如下所示

@Aspect
@Component
public class TransactionalAop { @Autowired
PlatformTransactionManager transactionManager; @Around("execution(* com.test.service.impl.*.*(..))")
public void aroundMethod(ProceedingJoinPoint pjp) throws Throwable {// // 利用spring框架提供的事务模板类进行事务操作
// TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager);
// transactionTemplate.execute((status) -> {
// Object result = null;
// try {
// result = pjp.proceed();
// } catch (Throwable e) {
// if (e instanceof RuntimeException) {
// throw (RuntimeException)e;
// }
// if (e instanceof Error) {
// throw (Error)e;
// }
// throw new RuntimeException(e);
// }
// return result;
// }); // 手动创建事务(同时开启事务)并根据方法调用结果进行事务回滚或者提交
TransactionStatus transaction = transactionManager.getTransaction(new DefaultTransactionDefinition());
try {
pjp.proceed();
} catch (Throwable e) {
transactionManager.rollback(transaction);
throw e;
}
transactionManager.commit(transaction);
}
}

如上所示,我们可以利用spring提供的TransactionTemplate类来进行事务的相关操作,但是这里使用有个小缺陷,就是execute(TransactionCallback<T> action)方法里的参数action中的doInTransaction(TransactionStatus status)方法没有显式抛出异常,所以我们只能在doInTransaction(TransactionStatus status)方法中抛出运行时异常或Error来进行事务的回滚。如果是自己手动进行事务开启、提交、回滚就不会存在这个问题,如上所示,利用PlatformTransactionManager接口的getTransaction(@Nullable TransactionDefinition definition)方法来进行事务的开启,最后根据方法的执行结果来进行事务提交或回滚操作。

综合:

第一种方法是老式的xml配置文件进行事务配置的方法,需要用到xml配置文件,在如今springboot肆意横行的时代(springboot允许我们加载xml配置文件,但是如果还在使用xml配置文件不是又回去了吗?!),这种配置方式已经算是落伍了。

第二种方法是基于注解进行事务配置的方法,算是比较方便。优点是:事务管理的粒度比较细,@Transactional既可以用在类上也可以用在方法上;缺点:至少每个业务逻辑的类都要用到@Transactional注解。

第三种方法是利用aop的动态代理原理,在方法调用之前进行事务开启,根据方法执行结果来进行事务的相关操作。优点:事务统一管理,不在需要每个类或方法上添加@Transactional注解;缺点:事务管理的粒度比较粗。

spring 事务管理配置的更多相关文章

  1. Spring事务管理配置以及异常处理

    Spring事务管理配置: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=" ...

  2. Spring事务管理配置示例

    (一).Spring事务特性 1.事务隔离级别 隔离级别是指若干个并发的事务之间的隔离程度. ISOLATION_DEFAULT:默认值,使用数据库的默认隔离级别,就是ISOLATION_READ_C ...

  3. 事务管理(下) 配置spring事务管理的几种方式(声明式事务)

    配置spring事务管理的几种方式(声明式事务) 概要: Spring对编程式事务的支持与EJB有很大的区别.不像EJB和Java事务API(Java Transaction API, JTA)耦合在 ...

  4. spring 事务管理方式及配置

    1.Spring声明式事务配置的五种方式 前段时间对Spring的事务配置做了比较深入的研究,在此之前对Spring的事务配置虽说也配置过,但是一直没有一个清楚的认识.通过这次的学习发觉Spring的 ...

  5. 配置spring事务管理的几种方式(声明式事务)

    Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource.TransactionManager和代理机制这三部分,无论哪种配置方式,一般变化的只是代理机制这部分. DataSo ...

  6. spring,mybatis事务管理配置与@Transactional注解使用[转]

    spring,mybatis事务管理配置与@Transactional注解使用[转] spring,mybatis事务管理配置与@Transactional注解使用 概述事务管理对于企业应用来说是至关 ...

  7. spring,mybatis事务管理配置与@Transactional注解使用

    spring,mybatis事务管理配置与@Transactional注解使用[转]   spring,mybatis事务管理配置与@Transactional注解使用 概述事务管理对于企业应用来说是 ...

  8. 【Java EE 学习 52】【Spring学习第四天】【Spring与JDBC】【JdbcTemplate创建的三种方式】【Spring事务管理】【事务中使用dbutils则回滚失败!!!??】

    一.JDBC编程特点 静态代码+动态变量=JDBC编程. 静态代码:比如所有的数据库连接池 都实现了DataSource接口,都实现了Connection接口. 动态变量:用户名.密码.连接的数据库. ...

  9. spring事务管理器设计思想(一)

    在最近做的一个项目里面,涉及到多数据源的操作,比较特殊的是,这多个数据库的表结构完全相同,由于我们使用的ibatis框架作为持久化层,为了防止每一个数据源都配置一套规则,所以重新实现了数据源,根据线程 ...

随机推荐

  1. Ant概念

    Ant是基于Java的.可以跨平台的项目编译和生成工具.

  2. 你知道python入门,是学到什么程度才算是吗?

    1.入门的标准是什么? 这是很多初学者都关注的问题,但又是一个很难回答的问题,问题的核心是采取什么标准来衡量一个人是否已经入门. 以知识量的多少来衡量是不是可行呢?有些人走马观花一般学了很多pytho ...

  3. Python爬取养眼图片

    1.准备 各位绅士们,你可能会觉得疫情在家无聊,那么现在我们的Python语言可以满足你们的需求.项目需要的工具(1)Python3(2)requests库requests库可以通过代码pip ins ...

  4. BUUOJ [极客大挑战 2019]Secret File

    [极客大挑战 2019]Secret File 0X01考点 php的file伪协议读取文件 ?file=php://filter/convert.base64-encode/resource= 0X ...

  5. shiro:集成Spring(四)

    基于[加密及密码比对器(三)]项目改造 引入相关依赖环境 shiro-spring已经包含 shiro-core和shiro-web 所以这两个依赖可以删掉 <!--shiro继承spring依 ...

  6. windows 系统使用技巧

    1 自定义发送到C:\Users\adm\AppData\Roaming\Microsoft\Windows\SendTo 2 自定义关机shutdown -s -t time,可写在快捷方式中shu ...

  7. Linux磁盘修复命令----fsck

    使用fsck命令修复磁盘时 一定要进入单用户模式去修复 语 法fsck.ext4[必要参数][选择参数][设备代号] 功 能fsck.ext4 命令: 针对ext4型文件系统进行检测 参数  -a 非 ...

  8. [SVN] Couldn't perform atomic initialization

    svn: Commit failed (details follow): svn: Couldn't perform atomic initialization It was because the ...

  9. zookeeper笔记(二)

    title: zookeeper笔记(二) zookeeper ALC权限控制 getAcl path 可以查看某个node的权限 设置权限: 2. world方式 setAcl <path&g ...

  10. Android混淆配置及总结

    Android打正式的release包混淆是必备的,避免APP被反编译,使项目中隐秘的技术或信息被别人查看. Android studio则写在proguard-rules.pro中,当然写在prog ...