事务基础知识
1. 数据库事务概述
https://www.bilibili.com/video/BV1iq4y1u7vj?p=161
1.1 存储引擎支持情况
1.2 基本概念
1.3 事务ACID特性
1.4 事务的状态
2. 如何使用事务
https://www.bilibili.com/video/BV1iq4y1u7vj?p=162&spm_id_from=pageDriver
2.1 显式事务
- 回滚到保存点的时候 事务 并没有结束(还需要进一步commit或者rollback)
2.2 隐式事务
自动提交
手动提交
对于DDL来说,都是自动提交!关闭事务自动提交只会影响DML
2.3 隐式提交数据的情况
2.4 使用举例1:提交和回滚
案例1
案例2:链式事务
2.5 使用举例2:测试不支持事务的engine
2.6 使用举例3:SAVEPOINT
3. 事务隔离级别
3.1 数据准备
3.2 数据并发问题
事务的隔离性要考虑多个线程操作同一个资源造成的多线程并发安全问题。
加锁可以非常完美的保证隔离性,但是这会造成数据库性能的大大下降。
- 如果两个事务并发的修改——必须隔离开
- 如果两个事务并发的查询——完全不用隔离
- 如果一个事务修改,另一个事务查询——脏读、不可重复读、虚读
1.脏写
感觉和脏读一个尿性。。
2. 脏读
一个事务读取到另一个事务还未提交的数据;
3. 不可重复读
一个事务读取到另一个事务的更新并提交的数据
4.幻读
一个事务读取到另一个事务插入或者删除并提交的数据
对于两个事务 T1, T2, T1 从一个表中读取了一个字段, 然后 T2 在该表中插入、删除 一些行,提交之后, 如果 T1 再次读取同一个表, 就会多出、少了几行
不可重复读和幻读的区别
3.3 SQL标准中的四种隔离级别
- 并发性和隔离性是两个有冲突的性质;
- 如何在保证隔离性的同时,提高并发性,就需要进行设计;每种隔离级别也对应着每种并发问题;
为了解决上面的三个问题,数据库提出四大隔离级别;隔离级别越高, 数据一致性就越好, 但并发性越弱。
3.4 MySQL所支持的四种隔离级别
3.5 如何设置事务的隔离级别
注意:无论是GLOBAL还是SESSION,只要是命令行修改,都只是内存级别,只要重启Mysql服务器,都会恢复默认值。
Global 演示
Session演示
3.6 不同隔离级别举例
1.read-uncommit级别引发脏读问题演示
2.read-commit级别引发不可重复读问题演示
3.repeatable-read级别
repeatable-read 解决了不可重复读问题:
幻读现象演示
Mysql 在repeatable-read 级别下是如何解决幻读问题的?
具体的讲解在将MVCC的时候会解释;
4. Serializable级别
4. 事务的常见分类