数据库的锁机制


前言

本文介绍数据库的锁机制,包括共享锁、更新锁、排他锁、行锁和表锁。


一、数据库的共享锁、更新锁、排他锁

引入锁机制,主要是为了应对并发的情况,保证数据的一致性和完整性

(1)MySQL数据库有哪些锁?

1.共享锁

  • 读锁,如果一个用户要去读一个数据,可以加上共享锁,这样其他用户就不能对该数据进行写操作,只有用户读完数据,释放读锁,其他用户才可以进行写操作;

  • 可以同时有多个共享锁。

2.更新锁

  • U锁,对一个数据上更新锁,说明过一会就要对这个数据进行写操作(更新锁升级为排他锁);

  • U锁可以解决部分由共享锁和排他锁导致的死锁问题;

  • U锁与共享锁是兼容的,U锁和其他U锁和排他锁是不兼容的

3.排他锁

  • 写锁,X锁,对数据进行修改的时候,加上写锁,此时数据不允许读和写,不允许访问;

  • 写锁和共享锁、更新锁都是不兼容的。

(2)什么是死锁?

举个例子:

事务a对资源1先读,后写,事务b对资源1先读,后写,二者同时读,就会发生死锁。

同时读,a和b分别对资源1加共享锁,此时,a想要写,需要把共享锁升级为排他锁,但是排他锁和共享锁不兼容(和b的共享锁),因此需要等待b释放共享锁,a才能升级为排他锁进行数据的修改,同理,b想要修改数据,需要升级排他锁,而也需要等待a去释放,二者相互等待,发生死锁。

(3)怎么解决死锁?

1.对于上面的这种情况,可以使用U锁去解决

a和b先分别对资源1进行上共享锁,不冲突,b呢,把共享锁变为更新锁,表示自己一会要更改数据,更新锁和a的共享锁不冲突,接下来,根据更新锁的特性,由更新锁升级为排他锁,此时无视排他锁和共享锁的互斥,这样b就可以加排他锁,修改数据,修改之后释放全部锁,a再升级排他锁进行修改,解决了死锁问题

2.使用悲观锁

3.使用乐观锁

(4)怎么避免死锁?

1.尽量按照顺序进行加锁和释放锁,避免冲突;

2.大的事务容易出现死锁,尽量把大的事务转化为小事务;

3.适当降低隔离级别;

4.使用合适的索引。

二、数据库的行锁和表锁

(1)概述

  • 数据库的锁总体分为悲观锁和乐观锁,悲观锁按照范围可以分为行锁和表锁,行锁根据算法不同还可以往下分。

  • 行锁和表锁是为了解决数据一致性的问题的

(2)行锁

  • 当更新数据的时候,可以加个行锁;

  • 行锁是指对一行或者多行数据加锁,加锁后,其他用户不能访问该行,可以访问其他行;

  • 行锁用到了索引,根据索引进行查找指定行;

  • 并发高,冲突多,可以引起死锁。

(3)表锁

  • 当插入数据的时候,可以用表锁锁住整个表;

  • 表锁是全局扫描,不是根据检索来的;

  • 表锁对整个表加锁,其他用户不允许访问该表任何一行;

  • 并发少,冲突少。

总结

本文简单的介绍了一下数据库的锁机制,希望对大家有所帮助。

本系列为基础知识分享,日更,有任何问题可以私聊或评论博主哦!
希望给各位找工作和工作中的小伙伴提供一点微博的帮助,如果觉得有帮助,欢迎点赞评论收藏关注~

  • 5
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值