1.开启事务
事务的四大特性
ACID是原子性(atomicity)、一致性(consistency)、隔离性 (isolation)和持久性(durability)的缩写。
事务的原子性:事务作为整体执行,要么都成功,要么都回滚。
原子:不可以再次分割 在事务中多条sql 语句,要么都执行成功,有一条失败,其他成功的sql 回滚
事务的一致性:表示当事务执行失败时,所有被该事务影响的数据都应该恢复到事务执行前的状态。
以转账为例:xiaoming 给wangli 转1000 xiaoming 和 wanli 的账户 总额 ,在转账前后不会发生变化 转账成功:xiaoming -1000 wangli +1000 转账失败:金额数据不变
事务的持久性:事务对数据库所做的操作是永久性的。
凡是事务提交的数据,当机器宕机、掉电 重启以后,数据还在,不丢失
事务的隔离性:多个事务在并发执行过程中,是相互独立的(隔离的)比如:售票过程。
隔离性 就是,一个事务能否看读取到另外一个事务未提交的数据
隔离级别
隔离级别:指的就是一个SqlSession 能否看到另外一个SqlSession 事务未提交的数据
隔离级别本质就是我们允许脏数据的程度
正在上传…重新上传取消
脏数据的程度
问题 | 描述 |
脏读 | 一个事务读取到另一个事务还未提交的数据。大于等于 read-commited 可防止 |
不可重复读 | 一个事务内多次读取一行数据的相同内容,其结果不一致。大于等于 repeatable-read 可防止 |
幻影读 | 一个事务内多次读取一张表中的相同内容,其结果不一致。serialized-read 可防止 |
正在上传…重新上传取消
3.1.1 概念
isolation
隔离级别
名称 | 描述 |
default | (默认值)(采用数据库的默认的设置) (建议) |
read-uncommited | 读未提交 |
read-commited | 读提交 (Oracle数据库默认的隔离级别) |
repeatable-read | 可重复读 (MySQL数据库默认的隔离级别) |
serialized-read | 序列化读 |
隔离级别由低到高为:read-uncommited < read-commited < repeatable-read < serialized-read
3.1.2 特性
- 安全性:级别越高,多事务并发时,越安全。因为共享的数据越来越少,事务间彼此干扰减少。
- 并发性:级别越高,多事务并发时,并发越差。因为共享的数据越来越少,事务间阻塞情况增多。
3.1.3 并发问题
事务并发时的安全问题
问题 | 描述 |
脏读 | 一个事务读取到另一个事务还未提交的数据。大于等于 read-commited 可防止 |
不可重复读 | 一个事务内多次读取一行数据的相同内容,其结果不一致。大于等于 repeatable-read 可防止 |
幻影读 | 一个事务内多次读取一张表中的相同内容,其结果不一致。serialized-read 可防止 |
不可重复读:可以解决更新时数据的一致性
幻影读:可以解决增加,删除数据时的一致性
参考:事务的四种隔离级别 - 吴小凯 - 博客园
传播行为
传播行为:就是在事务中的一个方法(增删改查),调用另外一个方法(增删改查),此时一个方法中的事务和另外一个方法中的事务是否共享(是否sqlSesion共享)
propagation
传播行为当涉及到事务嵌套(Service调用Service)时,可以设置:
- SUPPORTS = 不存在外部事务,则不开启新事务;存在外部事务,则合并到外部事务中。(适合查询)
- REQUIRED = 不存在外部事务,则开启新事务;存在外部事务,则合并到外部事务中。 (默认值)(适合增删改)
SUPPORTS
正在上传…重新上传取消
REQUIRED
正在上传…重新上传取消
事务的第一个方面是传播行为。传播行为定义关于客户端和被调用方法的事务边界。Spring定义了7中传播行为。