事务的隔离级别
事务的四大特性 ACID
事务特性 含义
原子性(Atomicity)
每个事务都是一个整体,不可再拆分,事务中所有的 SQL 语句要么都执行成功,要么都失败。
一致性(Consistency)
事务在执行前数据库的状态与执行后数据库的状态保持一致。如:转账前2个人的总金额是 2000,转账后 2 个人总金额也是 2000
隔离性(Isolation) 事务与事务之间不应该相互影响,执行时保持隔离的状态。
持久性(Durability) 一旦事务执行成功,对数据库的修改是持久的。就算关机,也是保存下来的。
事务在操作时的理想状态: 所有的事务之间保持隔离,互不影响。因为并发操作,多个用户同时访问同一个数据。可能引发并发访问的问题。
并发访问的问题以及含义
一个事务读取到了另一个事务中尚未提交的数据,例如我开启了两个事务,其中一个事务修改了另一个事务正在查看的值,但是还没有提交,此时第二个事务读取到的是已经修改的值,这就是脏读,因为如果第一个事务可以选择提交也可以选择回滚,那么就会对数据的安全造成问题。
演示:
一个事务中两次读取的数据内容不一致,要求的是一个事务中多次读取时数据是一致的,这是事务 update 时引发的问题。一样的,我开启了两个事务,第一个事务正准备修改某个数据,第二个事务此时已经查询了一次还没修改的值,此时第二个事务选择了提交修改(commit),而第二个事务在同一个事务里查询的时候发现数据居然改变了,和第一次在同一个事务里查询的居然不一样,这就是不可重复读。
一个事务中两次读取的数据的数量不一致,要求在一个事务多次读取的数据的数量是一致的,这是 insert 或 delete 时引发的问题。一样是两个事务,此时第一个线程查询了一下数据,而第二个数据在他查询完毕后刚刚好插入了一个数据,此时在同一个事务里再一次读取时,第一个事务再一次读取时发现数据数量变多了,这就是幻读。
MySQL 数据库有四种隔离级别,默认的隔离级别是repeatable read
查看方法:SELECT @@tx_isolation;
修改方法:SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED(以下四种类型);
上面的级别最低,下面的级别最高。“是”表示会出现这种问题,“否”表示不会出现这种问题。
级别 名字 隔离级别 脏读 不可重复读 幻读
1 读未提交 read uncommitted 是 是 是
2 读已提交 read committed 否 是 是
3 可重复读 repeatable read 否 否 是
4 串行化 serializable 否 否 否
隔离级别越高,性能越差,安全性越高。
视频学习