前言
本文介绍数据库的锁机制,包括共享锁、更新锁、排他锁、行锁和表锁。
一、数据库的共享锁、更新锁、排他锁
引入锁机制,主要是为了应对并发的情况,保证数据的一致性和完整性
(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)表锁
-
当插入数据的时候,可以用表锁锁住整个表;
-
表锁是全局扫描,不是根据检索来的;
-
表锁对整个表加锁,其他用户不允许访问该表任何一行;
-
并发少,冲突少。
总结
本文简单的介绍了一下数据库的锁机制,希望对大家有所帮助。
本系列为基础知识分享,日更,有任何问题可以私聊或评论博主哦!
希望给各位找工作和工作中的小伙伴提供一点微博的帮助,如果觉得有帮助,欢迎点赞评论收藏关注~