一,回顾事务
1.1什么是事务?
在数据库开发中,一组业务逻辑(ABCD)操作,要么全部成功,要么全部失败
1.2事务有什么特定?ACID
原子性:整体,原子不可分割。整个操作被看成一个整体,要么全部成功,要么全部失败
一致性:数据,事务操作的前后数据一致
隔离性:并发,两个事务之间并发访问情况
持久性:结果,事务一旦提交,不能回滚
1.3隔离有什么问题?
脏读:一个事务读到了另一个事务没有提交的数据
不可重复读:一个事务读到了另一个事务已提交的数据(update)
幻读:一个事务读到了另一个事务已提交的数据(insert)
1.4隔离级别有哪些?
读未提交( read uncommitted)
一个事务读到了另一个事务,没有提交的数据
存在3个问题,解决0个问题
读已提交(read committed)
一个事务读到了另一个事务,已经提交的数据
存在2个问题,解决一个问题(脏读)
可重复读(repeatable read )
一个事务中读到的数据重复的
存在1个问题,解决2个问题(脏读、不可重复读)
串行化(serializable)
单事务,没有并发
存在0个问题,解决3个问题(脏读、不可重复读、幻读)
1.5对比:速度、安全
速度 read uncommitted > read committed > repeatable read > serializable
安全 read uncommitted < read committed < repeatable read < serializable
ps:
MySQL默认隔离级别:repeatable read
Oracle默认隔离级别: read committed
二,事务详情
2.1研究Spring事务,需要学习事务管理平台管理器:PlatformTransactionManager
在平台管理器中,通过`事务的定义`获得事务,从而进行事务提交或回滚操作
2.2事务定义 TransactionDefinition 的详解:
2.3传播行为:一个事务调用另一个事务,事务共享问题
2.3.1 PROPAGATION_REQUIRED,required:支持当前事务,如果没有事务,创建一个新的。
A 有事务,B使用A的事务。(支持当前事务)
A没有事务,B创建新的。()
2.3.2 PROPAGATION_SUPPORTS,supports:支持当前事务,如果没有事务,以非事务执行。
A 有事务,B使用A的事务。(支持当前事务)
A没有事务,B以非事务执行。
2.3.3 PROPAGATION_MANDATORY,mandatory:支持当前事务,如果没有事务,抛异常
A 有事务,B使用A的事务。(支持当前事务)
A没有事务,B抛异常。
2.3.4 PROPAGATION_REQUIRES_NEW,requires_new:创建一个新事物,如果当前有事务,将挂起。
A 有事务,B创建新事务,同时挂起A事务。
A 没有事务,B创建新事务。
2.3.5 PROPAGATION_NOT_SUPPORTED, not_supported:不支持当前事务,以非事务执行,如果有挂起
A 有事务,B以非事务执行,同时挂起A事务。
A 没有事务,B以非事务执行。
2.3.6 PROPAGATION_NEVER, never:不支持当前事务,如果有抛异常。
A 有事务,B抛异常
A 没有事务,B以非事务执行。
2.3.7 PROPAGATION_NESTED, nested :嵌套事务,底层使用`savepoint`进行嵌套事务操作。
保存点允许回顾部分事务。
三,事务基本操作
编写配置类:
使用DataSourceTransactionManager 将DataSource交给事务管理器。
开始事务管理:@EnableTransactionManagement
在业务service层进行事务管理:
通过 @Transactional进行事务管理
相当于进行`事务定义 TransactionDefinition` 的描述
四,事务高级配置
@Transactional注解可以描述事务定义,一般情况默认值最常用