一、事务
概念
事务指的是满足 ACID 特性的一组操作,可以通过 Commit 提交一个事务,也可以使用 Rollback 进行回滚。
ACID
1.原子性
:事务被视为最小的单元,要么全部提交成功,要么失败全部回滚
2.一致性
所有事务对于同一数据保持一致性操作
3.隔离性
事务在修改到最终提交以前,对其他事物不可见
4.持久性
一旦提交做出的修改就会进入数据库,系统发生崩溃,事务执行的结果也不会丢失
并发一致性的问题
1.丢失修改
T1和T2同时修改,T1先修改T2后修改,T2的修改覆盖了T1的修改
2.脏读
T1修改了,T2去读了,,T1撤回,T2读的不对
3. 不可重复读
T2读取了一个数据,T1对齐做出修改,T2再读,和第一次读取的结果不一样。
4.幻读
T1读取某个范围的数据,此时T2插入了一个数据,读取的数据结果和上次不一样
封锁
封锁粒度MYSQL中提种封锁粒度:行级锁和表锁
锁的时候应该尽量只锁需要修改的那一部分,而不是所有的。所得资源越少,发生锁争用的可能性会越小,并发程度越高
1.读写锁
互斥锁,也叫x锁,也是写锁
共享锁,简称S锁,读锁
规定:
一个事务对数据对象加了X锁,其他事务不能对其读取和写
一个事务对数据对象加了S锁,其他事务不能对其更新,但是不能加X锁
意向锁
使用意向锁(Intention Locks)可以更容易地支持多粒度封锁。
在存在行级锁和表级锁的情况下,事务 T 想要对表 A 加 X 锁,就需要先检测是否有其它事务对表 A 或者表 A 中的任意一行加了锁,那么就需要对表 A 的每一行都检测一次,这是非常耗时的。
意向锁在原来的 X/S 锁之上引入了 IX/IS,IX/IS 都是表锁,用来表示一个事务想要在表中的某个数据行上加 X 锁或 S 锁。有以下两个规定:
一个事务在获得某个数据行对象的 S 锁之前,必须先获得表的 IS 锁或者更强的锁;
一个事务在获得某个数据行对象的 X 锁之前,必须先获得表的 IX 锁。
通过引入意向锁,事务 T 想要对表 A 加 X 锁,只需要先检测是否有其它事务对表 A 加了 X/IX/S/IS 锁,如果加了就表示有其它事务正在使用这个表或者表中某一行的锁,因此事务 T 加 X 锁失败。
三级封锁协议
一级封锁
T1封锁,必须加X锁,T2无法读取
二级封锁
在一级的基础上,要求要求+S锁,
三级封锁
四个隔离级别
未提交读
事务的修改,,即使没有提交 ,对其他事务也是可见的
提交读
一个事务只能读取已经提交的事务所做的修改。换句话说,一个事务所做的修改在提交之前对其它事务是不可见的。
可重复读
保证同一事务多次读取是一样的
可串行化
强制事务串行执行