Spring入门笔记之声明式事务
——2018年11月24日
- 什么是事务:
- 事务是从业务的角度讲,实现一个相对完整的功能的一组DML语句。
- Spring的声明式事务管理在底层是建立在AOP的基础上。其本质是方法前后的拦截,然后在目标方法开始之前创建一个事务,在执行这目标方法结束后,根据执行情况提交或者回滚事务。
- 声明式是最大的优点就是不需要通过编程的方式而进行管理事务,这样就不需要再业务逻辑代码中掺杂事务管理的代码,只需要在配置文件中做相关的事务规则声明,便可将事务规则应用到业务逻辑中。
- 事务的基本属性
事务属性:ACID(Atomicity Consistency Isolation Durability)
- Atomicity(原子性)
原子性体现在对于一个事务来讲,要么一起执行成功要么一起失败,执行的过程中是不能被打断或者执行其他操作的。
- Consistency(一致性)
一致性表现为事务进行过后和执行前,整体系统都是稳定的,比如对于入账出账操作是不会有总资金的变化的。
- Isolation(隔离性)
隔离性表示各个事务之间不会互相影响,数据库一般会提供多种级别的隔离。实际上多个事务是并发执行的,但是他们之间不会互相影响。
- Durability(持久性)
持久性表示一旦一个事务成功了,那么他的改变是永久性的被记录和操作。
- 事务的隔离级别
事务隔离级别 | 脏读 | 不可重复读 | 幻读 |
读未提交(read-uncommitted) | 是 | 是 | 是 |
不可重复读(read-committed) | 否 | 是 | 是 |
可重复读(repeatable-read) | 否 | 否 | 是 |
串行化(serializable) | 否 | 否 | 否 |
- 脏读:是指在一个事务处理过程里读取了另外一个未提交的事务中的数据
- 不可重复读:不可重复读是指在对于数据库中的某个数据,一个事务范围内多次查询却返回了不同的数据值,这是由于在查询间隔,被另一个事务修改并提交了。
- 幻读(虚读):幻读是事务非独立执行时发生的一种现象。幻读和不可重复读都是读取了另一条已经提交的事务(这点就脏读不同),所不同的是不可重复读查询的都是同一个数据项,而幻读针对的是一批数据整体(比如数据的个数)。
以上四种隔离级别最高的是Serializable级别,最低的是Read uncommitted级别,级别越高执行效率就越低。像Serializable这样的级别,就是以锁表的方式使得其他线程只能在外面等着,在mysql数据库中默认的隔离级别为Repeatable read(可重复读)
- 事务的传播行为:
Spring在TransactionDefinition接口中规定了7种类型的事务传播行为。事务传播行为是Spring框架独有的事务增强特性,他不属于的事务实际提供方数据库行为。这是Spring为我们提供的强大的工具箱。
概念:事务传播行为用来描述由某一个事务传播行为修饰的方法被嵌套进另外有个方法的时候事务是如何传播的。
Spring中七种事务传播行为:
Spring事务管理实现方式:
XML:
首先需要先整合mybatis和Spring,详情请参照上文:
注解: