天天看点

数据库的锁为什么:是什么:死锁

为什么:

当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性。

是什么:

在计算机科学中,锁是在执行多线程时用于强行限制资源访问的同步机制,即用于在并发控制中保证对互斥要求的满足。

加锁是实现数据库并发控制的一个非常重要的技术。当事务在对某个数据对象进行操作前,先向系统发出请求,对其加锁。加锁后事务就对该数据对象有了一定的控制,在该事务释放锁之前,其他的事务不能对此数据对象进行更新操作。

一提起锁肯定是和并发有关系,就是防止并发访问或者修改的时候出现问题

分类

从程序员角度

  • 乐观锁

假设认为数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果发现冲突了,则让返回用户错误的信息,让用户决定如何去做。

为数据增加的一个版本标识。当读取数据时,将版本标识的值一同读出,数据每更新一次,同时对版本标识进行更新。当我们提交更新的时候,判断数据库表对应记录的当前版本信息与第一次取出来的版本标识进行比对,如果数据库表当前版本号与第一次取出来的版本标识值相等,则予以更新,否则认为是过期数据。

  • 悲观锁

在整个数据处理过程中,将数据处于锁定状态。悲观锁的实现,往往依靠数据库提供的锁机制 (也只有数据库层提供的锁机制才能真正保证数据访问的排他性,否则,即使在本系统中实现了加锁机制,也无法保证外部系统不会修改数据)

按照锁粒度进行划分

  • 行锁

  • 页锁

  • 表锁

innoDB中更新的时候,如果条件是用索引,就会试用行锁,如果不使用,就是表锁。

从数据库管理的角度

  • 共享锁

也叫读锁或 S 锁(Share Lock),共享锁锁定的资源可以被其他用户读取,但不能修改。在进行SELECT的时候,可将对象进行共享锁锁定,当数据读取完毕之后,就会释放共享锁,这样就可以保证数据在读取时不被修改。

一般的查询不会加共享锁查询后面加入“LOCK IN SHARE MODE” 即可添加共享锁

  • 排它锁

也叫独占锁(eXclusive Lock)、写锁或 X 锁。排它锁锁定的数据只允许进行锁定操作的事务使用,其他事务无法对已锁定的数据进行查询或修改。

更新,删除都会加排它锁,查询的时候后面加入“for update”也可以添加排它锁

  • 意向锁

一个标记。会给锁粒度更大的级别上意向锁,比如数据库某一行上了一个排他锁,这行所在的页,和表都会上意向锁,下一次事务进来操作数据库,先看有没有意向锁,没有意向锁先上锁,然后操作,有的话,往下一层看有没有意向锁以此类推。

兼容性 X S
X × ×
S ×

死锁

  • 逻辑交错

事务一和二都要操作AB两个表,事务一A先执行,B后执行,事务二B先执行,A在执行。当事务一先把A表锁了同时事务二把B表锁了,就形成了死锁。

解决这种错误通常是逻辑上尽量操作顺序相同

  • 锁升级

事务A在用s锁,此时事务B在排队准备用x锁,当事务A想修改变成x锁,也会形成死锁。

解决这种错误在事务A查询的时候就用x锁

  • 频繁用表级锁更新

innoDB中如果更新的条件用到索引查询的话,会用行级锁,如果索引被破坏,会用表级锁。

一般情况下更新是会带id的这种几乎没有。