「这是我参与2022首次更文挑战的第2天,活动详情查看:2022首次更文挑战」
事务
四大特性
| 原子性Atomicity | 一致性Consistency | 隔离性Isolation | 持久性Durability | |
|---|---|---|---|---|
| 解释 | 事务是最小的单位,不允许进行分割, | 事务执行之前和执行完成之后这个 业务数据的状态是一致的(不会出现中间状态的数据) | 多个事务执行期间对数据的修改不会相互影响 | 事务执行完成之后,对数据的修改会保存在数据库中,不会再有回滚的操作出现 |
| 详细解释 | 即事务所执行的操作要么都完成要么都失败 | 这个一致性其实很多概念解释的都很模糊,比如 1. | 多个事务执行期间,对同一条数据不会产生影响 | |
| 实现方式 | 使用undo log实现 | 一般由代码层面来保证 | 通过加锁和MVCC去实现的 | 使用的redo log实现的 |
| 实现方式详解 | 1. 在操作任何数据之前,都先将数据备份到另一个地方(这个地方称之为undo log) 2. 然后就行数据修改 3. 如果出现异常或者执行了rollback操作,系统就使用undo log中的数据将数据恢复到事物执行之前的状态 | 1. 操作任何数据的时候,都将操作之后的数据进行备份到一个地方(这个地方就叫做redo log) 2. 事务提交之前将redo log持久化 3. 如果 系统出现崩溃则可以直接使用redo log恢复数据 |
事务并发的问题
- 脏读(Dirty read): (读取了后来回滚的操作)事务A读取了事务B未提交的数据修改,事务B又回滚了(读了不该读的数据)
- 幻读(Phantom read): (我以为我读取了全部)事务A读取了全部学生进行操作,结果事务B又加了学生(幻想自己读了所有)
- 不可重复读(Unrepeatableread): (我读取的数据被修改了)事务A读取的数据被事务B修改并提交了(同一个事务读的两次结果不一样了)与幻读的区别在与幻读针对新增和删除.不可重复度在于修改
理解起来很好理解,就是容易记混,哈哈哈
隔离级别
| 读未提交 | 读已提交 | 可重复读 | 串行化 | |
|---|---|---|---|---|
| 英文及简写 | Read UnCommited | Read Commited(RC) | Repeatable Read(RR) | Serializable |
| 概念 | 别的事务可以读到这个事物未提交的数据变更 | 该事务的数据变更只有在提交之后才能被别的事务读取到 | 在一个事务的过程中每次获取的数据都是一样的(即使有别的事务修改了数据并提交了) | 所有事务都是依次执行 |
| 避免的问题 (重复读、脏读、幻读) | null | 脏读(MVCC解决可重复读问题) | 脏读和重复读 | 所有 |
| 数据库默认 | oracle默认 | mysql默认 | ||
| 备注 | MVCC解决可重复读问题 | 为了解决可重复读的问题,Mysql使用了MVCC的方式。为了解决幻读的问题,Mysql使用了间隙锁。在该隔离级别上都有体现 | ||
| 生成readView的时机(MVCC作用在RR和RC上不同的原因) | 事务中每次select都会生成一个readView | 每个事务创建一个readView |
在启动参数中设置transaction_isolation即可配置事务隔离级别,查看当前隔离级别show variables like 'transaction_isolation'默认隔离级别是“可重复读”