浅谈spring事务管理的2种方式:编程式事务管理和声明式事务管理;以及@Transactional(rollbackFor=Exception.class)注解用法

版权声明:本站所提供的文章资讯、软件资源、素材源码等内容均为本作者提供、网友推荐、互联网整理而来(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考,如有侵犯您的版权,请联系我,本作者将在三个工作日内改正。 https://blog.csdn.net/weixin_42323802/article/details/83893378

事务的概念,以及特性:

百度百科介绍:
->数据库事务(Database Transaction) ,是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。 事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源。通过将一组相关操作组合为一个要么全部成功要么全部失败的单元,可以简化错误恢复并使应用程序更加可靠。一个逻辑工作单元要成为事务,必须满足所谓的 ACID(原子性、一致性、隔离性和持久性)属性。 事务是数据库运行中的逻辑工作单位,由DBMS中的事务管理子系统负责事务的处理。

spring 支持编程式事务管理以及声明式事务管理这两种方式;

1、编程式事务:

一种是spring官方推荐使用 TransactionTemplate ,另一种方式就是在PlatformTransactionManager上进行操作;

Spring框架进行事务的管理,首先使用TransactionDefinition对事务进行定义。通过PlatformTransactionManager 根据 TransactionDefinition的定义信息进行事务的管理。在事务管理过程中产生一系列的状态:保存到TransactionStatus中

2、声明式事务:

声明式事务管理建立在AOP之上的。其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。
一种是基于tx 和 aop名字空间的xml配置文件,另一种就是基于@Transactional注解;
xml配置可参考https://blog.csdn.net/weixin_42323802/article/details/83870719


@Transactional(rollbackFor=Exception.class)注解用法:

在声明式注解开发中,@Transactional(rollbackFor=Exception.class)注解作用为,如果类加了这个注解,那么这个类里面的方法只要抛出异常,就会回滚,数据库里面的数据也会回滚。

在@Transactional注解中如果不配置rollbackFor属性,那么事务只会在RuntimeException的时候才会回滚;


2018.11.14

spring的事务管理器接口 :PlatformTransactionManager

实现类有:
DataSourceTransactionManager SpringJdbc 或者iBatis持久化 使用
HibernateTransactionManager
JpaTransactionManager
JdoTransactionManager
JtaTransactionManager 一个事务跨越多个资源时候必须使用;

事务隔离级别5个:

int ISOLATION_DEFAULT = -1; // 默认级别
int ISOLATION_READ_UNCOMMITTED = 1; // 可以读未提交
int ISOLATION_READ_COMMITTED = 2; // 可以读已提交 oracle默认级别
int ISOLATION_REPEATABLE_READ = 4; //是否读取 其他事务提交修改后的 mysql默认级别
int ISOLATION_SERIALIZABLE = 8; // 是否读取 其他事务提交添加后的
int TIMEOUT_DEFAULT = -1; 无超时限制

spring事务的传播行为7个:

int PROPAGATION_REQUIRED = 0; //默认
int PROPAGATION_SUPPORTS = 1; //当前有事务就执行事务,没有就不执行;
int PROPAGATION_MANDATORY = 2;//使用当前事务,若当前没有事务 抛异常
int PROPAGATION_REQUIRES_NEW = 3;// 建新事务,若当前有事务,挂起当前事务
int PROPAGATION_NOT_SUPPORTED = 4;//以非事务方式执行,若当前存在事务,挂起当前事务
int PROPAGATION_NEVER = 5;//以非事务方式执行,若当前存在事务,抛异常
int PROPAGATION_NESTED = 6;// 若当前存在事务,嵌套事务执行;由用户决定,提交还是回滚


数据库并发引起的一系列读的问题:

1、脏读 :read uncommitted
2、不可重复读:read committed
3、幻读 :repeatable read

脏读,事务A读取事务B未提交的数据,若B回滚,事务A读取到的数据是无意义的,称之为脏读,该问题极为严重;
->不可重复读,事务A执行事务过程中,读取事务B数据2次,若事务B对数据进行了更新,导致A读取的结果和第一次不一致;该问题称之为不可重复读;
->幻读,事务A执行过程中,事务B进行了一个更新操作,并提交数据,导致事务A在2次读取数据结果不一致;

不可重复读和幻读的区别:
前者侧重于 修改删除数据,后者侧重于数据的新增;

->解决该问题,数据库添加表级锁,在事务执行时候,锁定表;根据锁定对象不同:分为行级锁和表级锁;根据并发事务锁定的关系上看:分为共享锁定和独占锁定,共享锁定会防止独占锁定但允许其他的共享锁定。而独占锁定既防止共享锁定也防止其他独占锁定。

由于锁机制复杂程度较高,所以设置数据库的隔离级别,数据库就会自动分析sql语句然后自动选择合适的锁;
但是,数据库隔离级别越高,并发性就越低,一般选择数据库默认的即可;

隔离级别 脏读 不可重复读 幻读 数据库默认
DEFAULT = -1
READ_UNCOMMITTED=1
READ_COMMITTED=2 x oracle默认的
REPEATABLE_READ=4 x x mysql默认的
SERIALIZABLE=8 x x x

参考自 http://www.cnblogs.com/clwydjgs/p/9317849.html
https://blog.csdn.net/starlh35/article/details/76445267

猜你喜欢

转载自blog.csdn.net/weixin_42323802/article/details/83893378