大家好,我是锋哥。今天分享关于【MySQL中有哪几种锁?】面试题。希望对大家有帮助;
MySQL中有哪几种锁?
1000道 互联网大厂Java工程师 精选面试题-Java资源分享网
在MySQL中,锁的种类主要有以下几种,主要用于控制对数据库资源(如表、行等)的并发访问,确保数据的一致性和完整性。
1. 全局锁(Global Lock)
2. 表锁(Table Lock)
- 用途:表锁是对整个表加锁,操作时其他事务不能修改该表的数据。表锁比较粗粒度。
- 类型:
- 共享锁(Read Lock):多个事务可以对同一表加共享锁,但不能修改数据,其他事务只能对该表加共享锁。
- 排他锁(Write Lock):当一个事务对表加排他锁时,其他事务不能再对该表加任何类型的锁,保证写入操作的独占性。
- 示例:
LOCK TABLES table_name READ;
(共享锁)LOCK TABLES table_name WRITE;
(排他锁)
3. 行锁(Row Lock)
- 用途:行锁作用于数据表中的具体行,粒度较细,能更好地支持并发访问。适用于InnoDB存储引擎。
- 类型:
- 共享锁(S Lock):允许事务读取数据,但不允许修改数据。
- 排他锁(X Lock):对指定的行加排他锁,其他事务不能访问该行。
- 示例:在
SELECT ... FOR UPDATE
查询时,会在读取的行上加上行锁。
4. 意向锁(Intention Lock)
- 用途:意向锁是一种表级锁,用于标识事务打算对某些行加锁(如行锁)。它是为了防止不同事务之间的锁冲突。
- 类型:
- 意向共享锁(IS):事务意图对某些行加共享锁。
- 意向排他锁(IX):事务意图对某些行加排他锁。
- 示例:在InnoDB中,行锁加锁前会先加意向锁,表示该表有行锁的意向。
5. 自定义锁(User-Defined Locks)
- 用途:用户可以在应用层自定义锁机制,控制事务的并发访问。比如使用
GET_LOCK()
等函数实现应用层锁。 - 示例:
SELECT GET_LOCK('lock_name', timeout);
:获取一个自定义名称的锁。SELECT RELEASE_LOCK('lock_name');
:释放自定义锁。
6. 死锁(Deadlock)
- 用途:虽然死锁不是一种明确的锁类型,但它是由于多个事务相互等待对方持有的锁而引发的。死锁会导致事务无法继续执行,需要回滚某个事务来打破死锁。
- 示例:在多个事务中,事务A持有锁X并等待锁Y,事务B持有锁Y并等待锁X,形成死锁。
7. 事务隔离级别与锁的关系
在MySQL中,锁的行为也受事务的隔离级别影响,常见的事务隔离级别有:
- 读未提交(Read Uncommitted):允许事务读取未提交的数据,锁的粒度最小。
- 读已提交(Read Committed):只能读取已提交的数据,锁的粒度较大。
- 可重复读(Repeatable Read):事务在执行期间读取到的数据在该事务内始终一致,通常会使用行锁。
- 串行化(Serializable):事务完全串行执行,不允许并发,使用最强的锁。
总结:
- 全局锁:锁住整个数据库实例。
- 表锁:锁住整个表。
- 行锁:锁住特定的行。
- 意向锁:标示事务对行加锁的意图。
- 自定义锁:应用层实现的锁。
- 死锁:多个事务相互等待的死循环状态。
锁是保证数据一致性和并发控制的重要手段,通过不同类型的锁可以根据实际业务场景的需求来平衡性能和数据一致性。