ICode9

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

数据库乐观锁与悲观锁

2021-01-06 15:33:48  阅读:247  来源: 互联网

标签:事务 账户 god 数据库 id 乐观 线程 悲观 age


数据库乐观锁与悲观锁

演示案例

为何需要乐观锁,与悲观锁这样的锁?

id name money
1 god 1000

假设god同志的账上有1000元,现在有两个线程同时往他的账户上转钱。

1.A线程准备向god账户上转200,读取到账户上有1000元,事务还未提交

2.B线程准备向god账户上转100,读取到账户上有1000元,事务也还未提交

3.A线程提交了事务,god账户上变成了1200元,但是B线程此时不知道god账户上变成了1200

4.B线程随即也提交了事务,god账户上变成了1200,少了100元

因此,加锁的目的在于保障一个线程修改数据时,这个数据没有被其他的线程修改过

悲观锁与乐观锁的区别

1.在事务的基础上,悲观锁更适合短事务(长事务导致其他事务一直被阻塞,影响了系统性能),适用于查少改多

2.在事务的基础上,乐观锁更适合长事务,他的本质并不是锁,而是通过代码实现的。适用于查多改少

悲观锁的使用案例

在查的时候,对数据进行锁定。

在数据库中:for update

在Django中:select_for_update()

原生的sql:

1 开启事务

2 查询的时候加锁 ---》 select * from user where id =1 for update

3 结束事务锁被释放

django中:

1 开启事务

2 在查询的时候 ---》 user.objects.select_for_update().flilter(id=1).first()

3 事务结束锁被释放

乐观锁的使用案例

乐观锁的本质不是锁。他是通过代码来实现锁的。

方法:先拿到age数据,在修改的时候再次判断age是否一样。

(代码实现)目的:将这个数据中的age在原来的基础上+1

1 开启事务

2 查询的时候不做任何操作。data = user.objects.flilter(id=1).first()

3 在修在数据的时候。user.objects.filter(id=1,age=data.age).updata(age=data.age+1)

从而在我查询到我修改的时候,没有人改动过

4 如果3中的影响行数为0,证明数据被人修改。循环再次执行。如果为1,证明数据没人动过,修改成功

''' 如果是可重复读,上面的乐观锁无效,必须改成read committed'''

标签:事务,账户,god,数据库,id,乐观,线程,悲观,age
来源: https://www.cnblogs.com/godlover/p/14241354.html

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

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

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

ICode9版权所有