摘要:Spring的事务管理主要由三个方面共同完成,事务管理器,事务定义信息,事务状态。
一 事务管理器:
主要提供三个方法,提交事务(commit),回滚事务(rollback),获取事务状态(getTransaction)
不同的框架提供了不同的PlatfromTransactionManager接口实现,spring对应的接口,使用连接进行事务控制:开启事务,提交事务,回滚事务。
用户应该根据持久层的技术来选择对应的事务管理器。
二 事务定义信息:
主要提供的方法,隔离级别获取,传播行为获取,获取超时时间,是否只读。
事务的隔离级别:default使用后端数据库默认的隔离级别,read_uncommited允许读取事务还未提交的数据,可能发生脏读,不可重复读,幻读。read_commited允许并发事务已经提交后读取,可以防止脏读,可能发生不可重复读,幻读。repeatable_read对相同字段多次读取一致,可防止脏读,不可重复读,但是可能发生幻读。serializable,完全服从ACID的隔离级别,确保不发生脏读,不可重复读,幻读。
脏读:一个事务读取了另外一个事务改写,但是还没有提交的数据,如果发生回滚,就会发生脏读。
不可重复读:在同一事务中,多次读取同一数据返回结果有所不听,因为在多次读取之后,因为其他的事务更新了数据,而被读取。相反可重复读,后续的读取不能读取到另外一事务提交的更新数据。
幻读:一个事务读取了几条信息之后,其他事务又增加的几条信息,然后在查询中,发现又多了几条信息。
事务的四大特征:ACID,指的是原子性 一致性 隔离性 持久性。
Mysql:默认隔离级别repeatable_read
Oracle默认隔离级别read_commited
事务的传播行为 :
事务的传播行为用于解决,两个被事务管理的方法之间相互调用的问题。
事务传播,一共分为七种,主要分为三种。
第一种,支持当前事务,A调用B,如果A存在,那么A和B处于同一个事务。
第二种,不支持当前事务,A调用B,如果A存在,那么B不会和A处于同一个事务。
第三种,嵌套事务,只对DataSourceTransactionManger有效,允许在同一个事务设置保存点,回滚保存点。
面试题目:REQUIRED REQUORES_NEW NESTED
REQUIRED,只有一个事务。
REQUIRES_NEW,存在两个事务,如果事务存在,挂起事务,重新又开启一个新的事务。
NESTED,嵌套事务,事务可以设置保存点,回滚到保存点,选择提交或回顾。
三 TransactionStatus事务状态:
判断是否有保存点,判断事务是否结束,判断当前事务是否开启了一个新的事务,判断事务是否只能回滚,设置事务是否回滚。
try{
操作;
}catch(){
rollback;
}finally{
commit;
}
三个事务超级接口之间的关系:
1.首先用户定义事务定义信息
2.根据用户定义信息,通过事务管理器进行管理。
3.在事务运行过程中,任何时间都可以用TransactionStatus来了解事务运行状态。
四 Spring事务管理两种方式
传统的编程式事务管理。
声明式事务管理,基于xml方式,基于注解方式。