Mysql锁介绍
举报
一颗小谷粒
发表于 2025/03/31 20:26:25
2025/03/31
【摘要】 MySQL 锁的介绍锁的类型共享锁(Shared Lock,S 锁):又称读锁,若事务 T 对数据对象 A 加上 S 锁,则其他事务只能对 A 加 S 锁,不能加 X 锁,直到 T 释放 A 上的 S 锁。多个事务可以同时对同一个数据对象加共享锁,用于并发读取数据,不会相互阻塞。例如,多个用户同时查询某张表的数据,他们都可以获得共享锁,从而可以同时读取数据。排他锁(Exclusive Loc...
MySQL 锁的介绍
- 共享锁(Shared Lock,S 锁):又称读锁,若事务 T 对数据对象 A 加上 S 锁,则其他事务只能对 A 加 S 锁,不能加 X 锁,直到 T 释放 A 上的 S 锁。多个事务可以同时对同一个数据对象加共享锁,用于并发读取数据,不会相互阻塞。例如,多个用户同时查询某张表的数据,他们都可以获得共享锁,从而可以同时读取数据。
- 排他锁(Exclusive Lock,X 锁):又称写锁,若事务 T 对数据对象 A 加上 X 锁,则其他任何事务都不能再对 A 加任何类型的锁,直到 T 释放 A 上的锁。排他锁用于确保在写入数据时的独占性,防止其他事务同时修改相同的数据,避免数据冲突。例如,当一个事务要更新某条记录时,它会先获取该记录的排他锁,这样其他事务就无法同时修改这条记录。
- 表级锁:对整个表进行锁定。优点是实现简单,加锁和解锁速度快,适用于大量数据的查询操作。缺点是并发度低,当一个事务对表加锁后,其他事务对该表的所有操作都可能被阻塞。例如,在对一张数据量很大的历史记录表进行全表备份时,可以使用表级锁,以防止在备份过程中有其他事务对表进行修改。
- 行级锁:仅对表中的某一行或几行数据进行锁定。行级锁的优点是并发度高,能够在同一表中允许不同事务同时访问不同的行数据,大大提高了数据库的并发处理能力。缺点是加锁和解锁的开销较大,因为需要更精细地管理锁资源。例如,在一个多用户同时操作的订单表中,当一个用户更新自己的订单状态时,只需要对该订单对应的行加锁,而不会影响其他用户对其他订单的操作。
- 页级锁:介于表级锁和行级锁之间,锁定粒度为数据页。它试图平衡表级锁和行级锁的优缺点,既能够在一定程度上提高并发度,又比行级锁的开销小。但在实际应用中,页级锁的使用相对较少。
- 定义:指两个或多个事务在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去,从而导致系统陷入僵局。例如,事务 T1 持有资源 R1 的锁,同时请求资源 R2 的锁;而事务 T2 持有资源 R2 的锁,同时请求资源 R1 的锁,这时就发生了死锁。
- 检测与处理:MySQL 会自动检测死锁的发生,并选择一个牺牲者(通常是回滚代价最小的事务),将其回滚,以打破死锁局面,使其他事务能够继续执行。同时,应用程序也可以通过设置合适的事务隔离级别、合理安排事务的执行顺序等方式来尽量避免死锁的发生。
- 并发控制:在多用户并发访问数据库时,通过加锁来控制对数据的访问顺序,确保数据的一致性。例如,在电商系统中,当多个用户同时购买同一件商品时,需要通过锁来保证库存的正确更新,避免超卖现象的发生。
- 数据完整性保护:防止在数据修改过程中被其他事务干扰,确保数据的完整性。例如,在银行转账业务中,需要对转出账户和转入账户进行加锁,以防止在转账过程中其他事务对账户余额进行修改,导致数据不一致。
- 行级锁:行级锁的并发性能通常更高。它只锁定需要操作的行,不同事务可以同时对表中的不同行进行操作,这样可以显著减少事务间的冲突和等待时间,提升系统的整体并发处理能力。例如在一个大型的电商订单系统中,多个用户可能同时对不同的订单进行操作,使用行级锁就可以让这些操作并行执行,互不干扰。
- 表级锁:表级锁的并发性能相对较低。当一个事务对表加锁后,其他事务对该表的任何操作都可能被阻塞,即使它们要操作的是不同的行。所以在高并发场景下,如果使用表级锁,会导致大量事务排队等待,降低系统的响应速度和吞吐量。不过在并发度较低的场景中,表级锁的性能劣势并不明显。
- 行级锁:适合对表中少量数据进行操作的场景。例如,在一个用户信息表中,当只需要更新某一个用户的信息时,使用行级锁可以只锁定该用户对应的行,而不会影响其他用户信息的操作。这样可以在保证数据一致性的同时,最大程度地减少对其他事务的影响。
- 表级锁:更适合对表中大量数据进行操作的场景。比如进行全量数据的备份、批量数据的更新或删除等操作时,使用表级锁可以避免在操作过程中其他事务对表进行修改,保证操作的原子性和数据的一致性。而且在这种情况下,使用行级锁可能会因为频繁加锁和解锁而带来较大的开销。
- 行级锁:行级锁的加锁和解锁操作相对复杂,需要维护更多的锁信息,因此锁开销较大。尤其是在对大量行进行操作时,频繁的加锁和解锁会消耗较多的系统资源,影响性能。
- 表级锁:表级锁的实现相对简单,加锁和解锁的速度快,锁开销小。在需要对整个表进行操作时,使用表级锁可以减少锁管理的开销,提高操作效率。
- 行级锁:如果业务要求对数据的并发访问非常高,并且需要保证每个事务的独立性和数据的实时性,那么行级锁是更好的选择。例如在股票交易系统中,多个用户可能同时进行买卖操作,需要对每一笔交易记录进行实时更新,行级锁可以满足这种高并发和实时性的需求。
- 表级锁:当业务对数据的一致性要求极高,不允许在操作过程中有其他事务对表进行干扰时,表级锁更为合适。例如在进行财务报表统计时,需要确保数据的准确性和完整性,使用表级锁可以防止在统计过程中数据被修改,保证报表的正确性。
推荐
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
评论(0)