1、 Spring事务管理
事务管理:本质是使用spring管理事务,完成数据库对于事务的支持。
事务:一系列对数据库操作的集合,一个操作错误,所有都必须回滚,其特点是acid。
(1)事务并发存在问题:
脏读:事务读取数据无效。事务T1将某一值修改,然后事务T2读取该值,此后T1因为某种原因撤销对该值的修改。
不可重复读:一个事务范围内两个相同的查询却返回了不同数据。由于查询时系统中其他事务修改的提交而引起的。侧重对同一个数据的修改。
幻读:多个事务操作统一数据集。同样的条件, 由于事务T2的修改,第 1 次和第 2 次读出来的记录数不一样。侧重对数据集的增加和删除。
丢失更新:事务T2操作覆盖了事务T1的操作。
(2)spring事务管理方法
编程式事务管理(编程式事务管理使用TransactionTemplate或者直接使用底层的PlatformTransactionManager),可以做到代码块事务的细粒度。
声明式事务管理:建立在AOP之上的,其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。就不需要在业务逻辑代码中掺杂事务管理的代码。
(包括两种方法:基于tx和aop名字空间的xml配置文件/基于@Transactional注解,对dao层注释)
@Transactional (propagation=Propagation.NOT_SUPPORTED) public class MyBatisServiceImpl implements MyBatisService { @Autowired private MyBatisDao dao; @Override public void insert(Test test) { dao.insert(test); 事物传播行为是PROPAGATION_NOT_SUPPORTED,以非事务方式运行,不会存入数据库 //抛出unchecked异常,触发事物,回滚 throw new RuntimeException("test"); } |
(3)事务隔离级别
若干个并发的事务之间的隔离程度。
(4)事务传播行为
在开始当前事务之前,一个事务上下文已经存在,此时有若干选项可以指定一个事务性方法的执行。