Spring-01-事务
David-zhang 人气:0Spring事务机制
spring事务机制最重要的两个配置项,隔离级别和传播特性。
1. 隔离级别
隔离级别针对高并发问题导致的数据库丢失更新问题
1.1 数据库的4大基本特征
- 原子性(Atomic):事务中的操作被看做是一个整体的业务单元,这个业务单元的操作要么全部成功,要么全部失败,不会出现部分成功的情况。
- 一致性(Consistency):事物完成后,所有数据的状态保持一致
- 隔离性(Isolation):为了防止数据库丢失更新的问题,数据库定义了隔离级别的概念
- 持久性(Duration):事务结束后,所有的数据会持久化到磁盘等持久化存储设备中,断电可访问
1.2 隔离级别具体
数据库标准提出了4类隔离级别:读未提交,读写提交,可重复读,串行化。
-
读未提交(read uncommitted):允许一个事务读取另一个事务未提交的数据,缺点是会出现脏读
- 读写提交(read committed):一个事务只能读取另一个事务已经提交的数据,缺点是会出现不可重复度
- 可重复读(repeatable read): 数据库阻塞读取已经被另外一个事务读取的信息,缺点是会出现幻读
- 串行化(serializable):所有的sql都会按照顺序执行
1.3 传播行为
在spring中一个方法调用另一个方法时,可以让事务采取不同的策略工作,如新建事务或者挂起当前事务,这就是事务的传播行为。
在
在 org.springframework.transaction.annotation中存在7种传播行为
REQUIRED(TransactionDefinition.PROPAGATION_REQUIRED)默认
如果当前方法存在事务就沿用当前事务,否则新建一个事务运行子方法
SUPPORTS(TransactionDefinition.PROPAGATION_SUPPORTS)
如果当前方法存在事务就沿用当前事务,否则采用无事务的方式运行子方法
MANDATORY(TransactionDefinition.PROPAGATION_MANDATORY)
必须使用事务,如果当前没有事务就会抛出异常,如果存在事务就会沿用当前事务
REQUIRES_NEW(TransactionDefinition.PROPAGATION_REQUIRES_NEW)
无论当前方法是否存在事务都会创建新的事务执行
这样事务就可以有新的锁和隔离级别等特性,与当前事务相对独立
NOT_SUPPORTED(TransactionDefinition.PROPAGATION_NOT_SUPPORTED)
不支持事务,如果当前方法存在事务,将挂起事务,运行方法
NEVER(TransactionDefinition.PROPAGATION_NEVER)
不支持事务,如果当前方法存在事务,则抛出异常,否则继续使用无事务机制执行
NESTED(TransactionDefinition.PROPAGATION_NESTED)
当前方法执行子方法,如果子方法发生异常,只回滚子方法执行过的SQL而不回滚当前方法的事务,这是通过在当前事务设置保存点(save point)来实现的。只回滚到当前保存点的数据状态,不会让保存点之前的代码也回滚
其中,黄色标识的为常用传播行为。
加载全部内容