ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

悲观锁、乐观锁和数据库的锁之间的关系

2019-05-06 20:40:12  阅读:198  来源: 互联网

标签:隔离 tb 数据库 乐观 悲观 test where 级别


  首先悲观锁和乐观锁是基于业务逻辑来讲的,他们和数据库的锁是不同的概念,数据库的锁是实现数据库事务的机制。

  乐观锁就在并发情况下,避免覆盖更新的一种机制,是程序员自己通过添加一个version字段实现,每次load数据都读出这个字段,在更新的时候比较下这个version字段是否一致而避免覆盖了不同的版本。至于他为什么叫乐观锁就是因为认为他的并发情况不高,即使发生并发导致更新失败也可以忍受。(适度控制并发,占用资源少,性能高,当然完全放任不管性能更高,根本不占用资源)

  而悲观锁是基于数据库的锁机制来实现的(可以理解为我用了事务就是使用了基于数据库的锁机制来实现悲观锁),直接通过锁住并发的资源,来减少并发产生的问题,数据库做到这一点的就是事务啦。

  数据库事务和锁机制是密不可分的,数据库事务就是通过锁机制来实现的,并且数据库事务隔离级别就是因为不同的级别,而采用不同的数据库锁,也这是数据库锁机制和事务隔离级别之间的关系。

  如下是测试代码。

case 1 ================================

 

 窗口1

begin tran
select * From tb_test  where id=1 

 窗口2

update tb_test set content='yyy	' where ID=1

result:  (1 row(s) affected)

这里采用了默认隔离级别,所以查询是没有加锁,也可以正常更新。

case 2 ================================

 窗口1

begin tran
select * From tb_test with (updlock) where id=1 

 窗口2

update tb_test set content='yyy	' where ID=1

 result: 无

这里发生了堵塞,因为这里显示使用了U锁。

case 3 ================================

窗口1

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ

begin tran

select * From tb_test  where id=1 

 窗口2

update tb_test set content='yyy	' where ID=1

 result:无

这里也发生了堵塞,我并没有显示使用U锁,但是是使用了更高级别的隔离级别,这里的隔离级别默认把SELECT查询添加了U锁,所以也导致了另外一个连接无法更新。

这里也看出了不同的隔离级别和不同的锁之间的关系,不同隔离级别是基于不同的锁来实现的。

标签:隔离,tb,数据库,乐观,悲观,test,where,级别
来源: https://www.cnblogs.com/luxiaobin/p/10821870.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有