面试题答案
一键面试1. 锁的类型
- 共享锁(读锁):多个事务可以同时持有共享锁,允许并发读取数据。例如,事务T1和T2都可以对表获取共享锁来读取数据,因为读操作不会修改数据,不会产生数据不一致问题。
- 排他锁(写锁):只允许一个事务持有排他锁,持有排他锁的事务可以对表进行写操作。例如,事务T3获取排他锁后,其他事务不能再获取任何类型的锁,直到T3释放排他锁,以防止其他事务在写操作期间对数据进行干扰,保证数据一致性。
2. 锁的获取机制
- 读操作:
- 当事务发起读操作时,它会请求获取共享锁。TABLE_SHARE会检查当前是否有排他锁存在。
- 如果没有排他锁,TABLE_SHARE会为该事务分配共享锁,允许事务进行读操作。多个事务可以同时持有共享锁,实现并发读。
- 如果存在排他锁,读操作事务会进入等待队列,等待排他锁释放后才能获取共享锁并执行读操作。
- 写操作:
- 当事务发起写操作时,它会请求获取排他锁。TABLE_SHARE会检查当前是否有其他锁(包括共享锁和排他锁)存在。
- 如果有任何锁存在,写操作事务会进入等待队列,因为排他锁要求独占访问。只有当所有其他锁都被释放后,该事务才能获取排他锁并执行写操作。
- 如果没有其他锁,TABLE_SHARE会为该事务分配排他锁,事务可以进行写操作。
3. 死锁检测与处理
- TABLE_SHARE会定期检查等待队列,检测是否存在死锁情况。例如,事务T1持有共享锁并等待排他锁,事务T2持有排他锁并等待共享锁,这种循环等待会导致死锁。
- 一旦检测到死锁,MariaDB会选择一个事务(通常是回滚代价最小的事务)进行回滚,释放其持有的锁,使其他事务能够继续执行,从而打破死锁。
4. 锁升级
- 在某些情况下,TABLE_SHARE可能会进行锁升级。例如,一个事务最初以共享锁读取数据,之后又需要进行写操作。此时,它需要将共享锁升级为排他锁。
- 锁升级时,TABLE_SHARE会检查是否有其他事务持有共享锁。如果有,升级操作会等待其他共享锁释放后再将锁升级为排他锁,以确保数据一致性。
5. 锁超时
- TABLE_SHARE会为等待锁的事务设置一个超时时间。如果一个事务在超时时间内未能获取到所需的锁,它会自动放弃等待并抛出超时异常。
- 这可以防止事务无限期等待锁,提高系统的可用性和性能。