数据库锁

锁在数据库中用来保持并发时的安全性,确保同一时间对数据库的操作是不会出现问题的。

锁的性质分类

  1. 乐观锁:乐观锁是一种概念,不为数据加显示的锁,但是会维护一个版本号或者时间戳,在完成数据操作的时候会检查这个版本号,如果不大于之前获取的值则说明在此期间没有发生更新,可以完成事务。乐观锁有更好的并行性,但是在事务处理比较集中的时候失败率比较高,在事务分散的时候效率不错。而且在多服务多系统中,如果其他的服务调用了本数据库,需要在多个服务之间同步版本号的逻辑,比较复杂,耦合度高。

  2. 悲观锁:悲观锁的概念就是预测一定会发生并发问题,所以在代码中就使用锁来保证安全。悲观锁是对应于乐观锁的一种概念,具体的实现还有很多种。

  3. 排他锁:排他锁也叫做写锁,就是严格的排他,在一个锁获得了当前的操作权后其他的任何锁都要等待他完成并释放。

  4. 共享锁:共享锁也叫做读锁,多个共享锁可以一起工作,因为只是读取数据。

  5. 更新锁:用来预定要对此对象施加X锁,它允许其他事务读,但不允许再施加U锁或X锁;当被读取的对象将要被更新时,则升级为X锁,主要是用来防止死锁的。因为使用共享锁时,修改数据的操作分为两步,首先获得一个共享锁,读取数据,然后将共享锁升级为排它锁,然后再执行修改操作。这样如果同时有两个或多个事务同时对一个对象申请了共享锁,在修改数据的时候,这些事务都要将共享锁升级为排它锁。这些事务都不会释放共享锁而是一直等待对方释放,这样就造成了死锁。如果一个数据在修改前直接申请更新锁,在数据修改的时候再升级为排它锁,就可以避免死锁。


锁的功能分类

  1. 行级锁 锁的作用范围是行级别,数据库能够确定那些行需要锁的情况下使用行锁,如果不知道会影响哪些行的时候就会使用表锁。举个例子,一个用户表user,有主键id和用户生日birthday当你使用update … where id=?这样的语句数据库明确知道会影响哪一行,它就会使用行锁,当你使用update … where birthday=?这样的的语句的时候因为事先不知道会影响哪些行就可能会使用表锁。行级锁可能产生死锁,因为在行级中一行需要使用其他行的数据,其他行需要使用之前的数据,导致死锁。

  2. 表级锁 锁的作用范围是整张表。

  3. 页级锁 介于行级锁和表级锁之间,会产生死锁。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值