事务就是为了保证一组操作,同时执行成功,或者同时执行失败,保证数据库数据的一致性。Spring中也提供了事务管理功能,主要提供了三个接口对事务进行管理。
PlatformTransctionManager接口 ,transactiondefinition接口,transactionstatus接口。下面我们看下这三个接口的作用。
1.PlatformTransctionManager接口
PlatformTransctionManager接口是事务管理器接口,通过它的实现类可以可以对不同的数据源以及不同的框架进行事务管理。PlatformTransctionManager提供了对JDBC和mybaits的事务管理实现类,以及hibernate和jpa的事务管理功能。
DataSourceTransactionManager 主要是只对jdbc和mybaits进行事务管理功能
JtaTransactionManager主要是针对jta进行事务管理
HibernateTransactionManager是hibernate的事务管理器
2.,Transactiondefinition接口
主要用来定义事务信息,包括事务的隔离级别,事务的传播性,事务的超时控制以及事务的只读设置
隔离级别主要是用来设置在事务中对数据读取的处理情况,包括脏读,幻读,不可重复读等的设置,默认有4个隔离级别
Read Uncommitted:一个事务可以读取到另一个事务以及修改但尚未提交的数据,可以导致出现脏读,幻读,不可重复读
Read Committed:开启一个事务,读一个数据,而后再次读,这2次可能不一样的,可以防止脏读,但是可能发生幻读和不可重复读
Repeatable Read:可重复读取数据,开启一个事务,读一个数据,而后再次读,这2次读的数据是一致的,可以防止脏读,不可重复读,但幻读仍然可能发生
Serializable:串行读取,一次只能保证系统中有一个事务在运行,不会出现脏读,幻读,可重复读的情况,这种设置影响效率,一般情况下很少用。
可能有些同学还对下面这几个概念不是太清晰,我们这里来顺便解释下
脏读: 一个事务在执行过程中已经修改数据,但是尚未提交,我们仍然可以读取到尚未提交的数据,这就数据脏读,比如在事务中把张三的邮箱修改了,但是事务还没提交,我们仍然可以读取到修改后的邮箱。
幻读:一个事务中前后两次读取的数据结果不一致,侧重于新增和删除操作,比如在事务1中查询所有员工的数量为100,在事务2中新插入了一个员工信息,并提交,事务1中再次查询发现员工信息为101,多了一条,出现了幻读现象
不可重复读:一个事务中前后两次查询却返回了不同的数据,比如在事务1中,第一次查询张三的邮箱为A,事务还未提交, 事务2中修改了张三的邮箱为B,并且提交,事务1中再次查询到张三的邮箱和上次不一样。 不可重复读侧重于修改操作。
事务传播类型
PROPAGATION_REQUIRED:如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。
假如有AAA和BBB两个方法,如果AAA有事务,BBB就用AAA的事务,如果AAA没有事务,就创建一个事务,保证两个方法在同一个事务中运行
PROPAGATION_SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行。
假如有AAA和BBB两个方法,如果AAA有事务,BBB就用AAA的事务,如果AAA没有事务,就不用事务。
PROPAGATION_MANDATORY:使用当前的事务,如果当前没有事务,就抛出异常。
假如有AAA和BBB两个方法,如果AAA有事务,BBB就用AAA的事务,如果AAA没有事务,就抛出异常
------以上三种保证两个方法在同一个事务里面
PROPAGATION_REQUIRES_NEW:新建事务,如果当前存在事务,把当前事务挂起。
假如有AAA和BBB两个方法,如果AAA有事务,就把AAA事务挂起,如果AAA没有事务,BBB自己新建一个事务。保证两个方法不在一个事务中。
PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
假如有AAA和BBB两个方法,如果AAA有事务,就把AAA事务挂起,如果没有,就不使用事务
PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。
----以上三种保证两个方法在不同的事务里面
PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。
3.Transactionstatus接口
TransactionStatus接口可以让事务管理器控制事务的执行,可以检查事务是不是一个新事务,或者是否只读。TransactionStatus还可以初始化回滚操作.读取事务的执行状态等。