面试题答案
一键面试INSERT操作
- 自动加锁:在执行INSERT操作时,MySQL会自动对插入的行添加排他锁(X锁),以防止其他事务同时插入相同的数据。这确保了数据的唯一性和一致性。例如,在向具有唯一索引的表中插入数据时,MySQL会先检查是否存在冲突,若不存在则加锁插入。
- 锁的释放:插入操作完成后,在当前事务提交或回滚时,排他锁会被释放。
UPDATE操作
- 不同事务隔离级别下的加锁:
- 读未提交(Read Uncommitted):此隔离级别下,UPDATE操作会对满足条件的行加排他锁(X锁),允许脏读。例如执行
UPDATE table SET column = value WHERE condition;
,满足condition
的行都会被加上X锁。 - 读已提交(Read Committed):同样对满足条件的行加排他锁(X锁),但仅在语句执行期间持有锁。当语句执行完,锁就会释放。例如,一个事务中多条UPDATE语句,每条语句执行时加锁,执行完解锁。
- 可重复读(Repeatable Read):不仅对满足条件的行加排他锁(X锁),还会对索引记录加锁(Next-Key Lock),防止幻读。如果条件基于唯一索引且能确定唯一行,则只加行锁;否则加Next-Key Lock。例如,在可重复读隔离级别下,多次执行相同的UPDATE语句,中间即使有其他事务插入满足条件的数据,也不会出现幻读情况。
- 串行化(Serializable):对整个表加锁,等同于将所有操作串行化执行。UPDATE操作时,会对表中所有可能满足条件的行加排他锁(X锁),阻止其他事务对表的任何读写操作。
- 读未提交(Read Uncommitted):此隔离级别下,UPDATE操作会对满足条件的行加排他锁(X锁),允许脏读。例如执行
- 锁的释放:在事务提交或回滚时,UPDATE操作所加的锁会被释放。
DELETE操作
- 加锁方式:DELETE操作与UPDATE操作类似,在不同事务隔离级别下加锁方式相似。对满足删除条件的行加排他锁(X锁)。例如
DELETE FROM table WHERE condition;
,满足condition
的行都会被加上X锁。 - 锁的释放:在事务提交或回滚时,DELETE操作所加的锁会被释放。
总结
- 行级锁的目的是为了保证在并发操作下数据的一致性和完整性。
- 不同的事务隔离级别对行级锁的使用方式有影响,隔离级别越高,锁的粒度可能越大,并发性能可能越低,但数据一致性更有保障。在写多读少场景下,合理选择事务隔离级别和锁机制,可以在保证数据一致性的同时,尽量提高系统的并发处理能力。