这里写目录标题
一、事务
1.1 、事务特性
事务的四大特性(ACID),分别表示原子性(atomicity)、一致性(consistency)、隔离性(isolation)、持久性(durability)。
- 原子性: 整个事务中的操作要么全部提交成功,要么全部失败回滚。整个执行过程不可分割。
- 一致性: 数据库总是从一个一致性的状态转换到另外一个一致性的状态。比如转账过程中某个步骤出问题不会导致转账账户转账失败损失金额的情况。
- 隔离性: 一个事务所做的修改在提交以前,对其他事务是不可见的。
- 持久性: 一旦事务提交成功,则修改会永久保存到数据库中。
1.2、事务的隔离级别
- read-uncommitted(未提交读): 即事务可以读取到未提交的数据,即脏读数据。
- read-committed (不可重复读):一个事务开始时,只能读取到已经提交的数据,这会导致第一次读取的数据和第二次读取的数据不一致的情况。
- repeatable-read(可重复读):可重复读是MSQL默认的隔离级别,可以避免脏读,但是无法避免幻读。所谓幻读是一个事物在读取过程中另外一个事物又插入了数据。从而产生了幻行。
- serializable (串行化):避免了幻读,但是serializable会在读取的每一行加锁,导致大量的超时和锁争用的情况。
不可重复读与幻读的区别:
不可重复读:指在修改过程中读取不一致的情况(update)。
幻读:指在新增和删除导致读取的数据行数不一致(insert、delete)。
二、锁
2.1、行锁(Record Locks)
- 共享锁(S锁):也称读锁,读锁是共享的,互相不阻塞。事务在请求s锁前,要先获得IS锁。
使用方式: select … in share mode
- 排他锁(x锁) : 也称写锁,写锁是排他的,也就是一个写锁会阻塞其他的写锁和读锁。事务在请求x锁前,要先获得IX锁。
使用方式: select … for update
说明:锁是加在索引上面,行锁最终落到聚簇索引上。在获取行锁之前会先获取相关的意向锁的目的是为了提高性能,因为在判断数据行有没有被锁定是根据意向锁进行判断的。
2.2、 表锁
- 意向共享锁(IS锁):也称读锁,读锁是共享的,互相不阻塞。
- 意向排他锁(IX锁) : 也称写锁,写锁是排他的,也就是一个写锁会阻塞其他的写锁和读锁
- 自增锁: 自增锁是MySQL一种特殊的锁,如果表中存在自增字段,MySQL便会自动维护一个自增锁。
2.3、 间隙锁(Gap Locks)
指的是对索引的区间(间隙)加锁。
注:只有在事务隔离级别是repeatable-read(可重复读)和Serializable(串行化)时才会存在间隙锁。
2.4、插入意向锁
(IIX,也属于一种特殊的间隙锁,不同于间隙锁的是,该锁只用于插入操作),但是两个事务不能同一时间内一个拥有间隙锁,一个拥有该间隙区间内的插入意向锁。
2.5、临键锁(Next-Key Locks)
就是(行锁 + 间隙锁)组合锁
具体锁分析案例可以参考如下博客:
https://www.cnblogs.com/rjzheng/p/9950951.html