面试题答案
一键面试- 共享锁机制
- 在MySQL中,共享锁(S锁)允许多个事务同时对同一数据对象加锁。当一个事务对数据加共享锁后,其他事务也可以对该数据加共享锁,但不能加排他锁。例如,事务T1对数据行R加了共享锁,事务T2也可以成功对R加共享锁,因为共享锁之间是兼容的。
- 这种机制保证了多个读取操作可以同时进行,提高了并发读取的效率。
- 事务特性 - 隔离性
- 事务隔离级别:MySQL有不同的事务隔离级别,如读未提交(Read Uncommitted)、读已提交(Read Committed)、可重复读(Repeatable Read)、串行化(Serializable)。在并发读取场景下,不同隔离级别对共享锁的使用和数据一致性有不同影响。
- 可重复读(默认级别):当事务在可重复读隔离级别下读取数据时,会为读取的数据加共享锁(快照读除外)。这意味着在事务的整个生命周期内,多次读取同一数据时,其他事务对该数据的修改(需加排他锁)无法进行,直到当前事务结束释放共享锁。例如,事务T1在可重复读隔离级别下开始读取数据行R并加共享锁,在T1未结束时,事务T2想要修改R,由于T2需要加排他锁,而排他锁与T1的共享锁不兼容,T2只能等待T1释放锁,从而保证了T1多次读取R的数据一致性。
- 串行化:在串行化隔离级别下,所有事务会依次执行,就像串行一样。读取操作会自动获取共享锁,任何写操作都需要获取排他锁,并且写操作会阻塞读操作,读操作也会阻塞写操作。这确保了数据的绝对一致性,因为同一时间只有一个事务可以访问数据。但这种隔离级别会严重影响并发性能。
- 锁的释放
- 共享锁在事务结束时释放(无论是正常提交还是回滚)。只有当共享锁释放后,其他事务才有可能对数据进行修改操作。这保证了在事务进行过程中,读取到的数据不会被其他事务修改,从而确保了多个读取操作获取到的数据具有一致性。例如,事务T1读取数据并加共享锁,在T1事务未结束时,数据一直处于被共享锁保护的状态,其他事务无法修改,当T1结束释放共享锁后,其他事务才可以对数据进行操作。