数据库的锁

为什么:

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

是什么:

在计算机科学中,锁是在执行多线程时用于强行限制资源访问的同步机制,即用于在并发控制中保证对互斥要求的满足。
加锁是实现数据库并发控制的一个非常重要的技术。当事务在对某个数据对象进行操作前,先向系统发出请求,对其加锁。加锁后事务就对该数据对象有了一定的控制,在该事务释放锁之前,其他的事务不能对此数据对象进行更新操作。

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

分类

从程序员角度

  • 乐观锁

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

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

  • 悲观锁

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

按照锁粒度进行划分

  • 行锁

  • 页锁

  • 表锁

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

从数据库管理的角度

  • 共享锁

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

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

  • 排它锁

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

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

  • 意向锁

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

 

兼容性XS
X××
S×

死锁

  • 逻辑交错

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

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

  • 锁升级

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

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

  • 频繁用表级锁更新

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

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

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于Spring事务和数据库的相关问题,我可以为你提供一些基本的信息。请注意,以下内容仅供参考。 Spring事务是一种用于管理数据库操作的机制,它确保了数据的一致性和完整性。在Spring中,你可以使用声明式事务或编程式事务来管理数据库操作。 声明式事务是通过在方法或类级别上添加事务注解来实现的。常用的事务注解包括`@Transactional`,它可以应用在方法或类上,并提供了一系列属性来配置事务的行为。 编程式事务是通过编写代码来手动管理事务的开始、提交和回滚过程。Spring提供了`TransactionTemplate`类来支持编程式事务管理。 关于数据库,它是一种用于控制并发访问数据库的机制。数据库可以保证数据的一致性和完整性,防止多个事务同时对同一数据进行修改而导致冲突。 常见的数据库包括行级、表级和页级。行级用于锁定数据库中的单个数据行,表级用于锁定整个表,而页级则用于锁定数据库中的页。 在Spring事务中,默认情况下,使用的是数据库的行级机制。如果需要使用其他级别的或更复杂的模式,你可以在SQL语句中明确指定。 需要注意的是,使用机制可能会导致性能下降和死等问题。因此,在设计和实现数据库操作时,需要合理地选择和使用机制。 希望以上信息对你有所帮助。如果你还有其他问题,请继续提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值