数据库悲观锁经常在Java面试被问到,比如数据库悲观锁有哪些等,下面我来详解数据库悲观锁@mikechen
数据库悲观锁定义
悲观锁是一种常见的并发控制机制,用于在数据库操作期间防止多个事务对同一数据资源进行不一致的修改。
数据库悲观锁的作用
悲观锁的作用就是:能够防止并发冲突,确保数据的一致性和可靠性。
然而,悲观锁的缺点:可能会导致性能下降,尤其是在高并发的情况下。
原因就是:当一个事务想要修改一个被加锁的资源时,它必须先获取该资源的锁,这种等待可能会导致性能问题,因此悲观锁通常用于少量并发事务的场景。
数据库悲观锁的实现
数据库悲观锁主要有以下3种:
1.行级锁(Row-Level Locks)
在事务操作过程中,对数据库中某一行进行锁定,以保证在整个事务操作期间该行数据不被其他事务修改。
常见的行级锁包括 :SELECT … FOR UPDATE 和 SELECT … LOCK IN SHARE MODE 语句。
2.表级锁(Table-Level Locks)
在事务操作过程中,对整张表进行锁定,以保证在整个事务操作期间该表不被其他事务修改。
表级锁可以分为:共享锁(Shared Lock)和排他锁(Exclusive Lock)两种。
3.数据库级锁(Database-Level Locks)
在事务操作过程中,对整个数据库进行锁定,以保证在整个事务操作期间该数据库不被其他事务修改。
数据库级锁通常很少使用,因为它会阻塞整个数据库的访问,影响整个系统的性能。
数据库悲观锁的使用示例
在 MySQL 中,可以使用 SELECT … FOR UPDATE 或者 SELECT … LOCK IN SHARE MODE 语句来实现悲观锁。
例如,以下语句将会锁定 id 为 1 的行:
BEGIN; SELECT * FROM table_name WHERE id = 1 FOR UPDATE; -- 对查询结果进行修改 COMMIT;
SELECT … FOR UPDATE 语句可以锁定 SELECT 语句查询到的行,使得其他事务无法修改这些行,直到当前事务提交或回滚。
需要注意的是,在使用悲观锁时要避免死锁和性能问题。因此,应该选择恰当的锁粒度和并发度,以及避免在事务中过长时间持有锁。
以上就是数据库悲观锁的详解,如果还想了解乐观锁,请查看:数据库乐观锁详解(2种实现方式示例)
mikechen睿哥
mikechen睿哥,十余年BAT架构经验,资深技术专家,就职于阿里、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!
后台回复【面试】即可获取《史上最全阿里Java面试题总结》,后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》