没有合适的资源?快使用搜索试试~ 我知道了~
文章标题一: 使用场景二: 保证线程安全的新方法三: 实际使用场景四: 测试实例五: 总结 温馨提示: 本文总共3890字,阅读完大概需要3-6分钟,希望您能耐心看完,倘若你对该知识点已经比较熟悉,你可以直接通过目录跳转到你感兴趣的地方,希望阅读本文能够对您有所帮助,如果阅读过程中有什么好的建议、看法,欢迎在文章下方留言或者私信我,您的意见对我非常宝贵,再次感谢你阅读本文。 一: 使用场景 一: 使用场景 (一) : 你是否在开发中会经常遇到下面的疑惑呢? 1、某段代码在并发的情况下可能会出现线程安全问题,该用什么方式来防止这种情况的出现呢? 2、可能你了解到
资源详情
资源评论
资源推荐
你真的懂你真的懂for update?(面试必备面试必备)
文章标题文章标题一: 使用场景二: 保证线程安全的新方法三: 实际使用场景四: 测试实例五: 总结
温馨提示: 本文总共3890字,阅读完大概需要3-6分钟,希望您能耐心看完,倘若你对该知识点已经比较熟悉,你可以直接通过目录跳转到你感兴趣的地方,希望阅读本文能够对您有所帮
助,如果阅读过程中有什么好的建议、看法,欢迎在文章下方留言或者私信我,您的意见对我非常宝贵,再次感谢你阅读本文。
一: 使用场景
一一: 使用场景使用场景
(一) : 你是否在开发中会经常遇到下面的疑惑呢?
1、某段代码在并发的情况下可能会出现线程安全问题,该用什么方式来防止这种情况的出现呢?
2、可能你了解到可以使用Synchronized关键字来处理,但是Synchronized是通过悲观锁来实现的,你还会考虑到如果锁的范围太大,会很因影响到代码执行的效率,同时,Synchronized
只适用于单机版,如果存在集群情况下(现在都流行分布式,这个情况也难免会遇到),它并不能保障不出现并发问题,那么,此时该使用什么方式来解决呢?
3、你可能又了解到可以使用Redis的分布式锁,或者使用Zookeeper来解决,但是这个又比较麻烦,是否还存在其他的方式呢?
4、面试时被问到: 在你开发过程中,保障线程安全除了使用Synchronized,你还使用过其他的方式?能够简单的说说使用的方式和原理?
(二) : 阅读完以上的问题,如果你在开发中有遇到过类似的,但没有找到比较好的解决方式的话,就继续往下阅读文章吧,或许你能够在其中找到一些些帮助。
二: 保证线程安全的新方法
二二: 保证线程安全的新方法保证线程安全的新方法
(一)阅读完上面的问题后,你会发现使用Synchronized不能完全满足你的需求,使用Redis等分布式锁又比较麻烦,是不是还要更好的方法来处理这个问题呢? 是的,那就是我们本文的
主角 For update,它可以帮你解决这个疑惑,从此走上发财致富的道理(笑…),下面我们就具体来了解下今天的主角吧。
(二)For Update是什么?
定义: for update是一种行级锁,又叫排它锁,一旦用户对表某个行记录施加了行级加锁,则该用户可以查询也可以更新被加锁的数据行,其它用户只能查询但不能更新被加锁的
数据行,如果其它用户想更新该表中的数据行,则也必须对该表施加行级锁.即使多个用户对一个表均使用了共享更新,但也不允许两个事务同时对一个表进行更新,真正对表进行更
新时,是以独占方式锁表,一直到提交或复原该事务为止。行锁永远是独占方式锁。
看完定义后是不是感觉还是有点懵逼呀? 那么我们就用通俗的话来它是什么意思: 简单地讲for update就是将原来我们在代码里面加锁的情况转移到在数据库操作时进行加锁,通过
它,我们不需要在代码逻辑中手动进行加锁,只需要在需要操作的记录时使用select 结合for update即可锁定数据,但是两个事务不能同时操作被锁定的数据,只有等一个事务提交完后另一
个事务才只能操作,从而保证了线程安全问题。
通常情况下,select语句是不会对数据加锁,妨碍影响其他的DML和DDL操作。select … for update 语句是我们经常使用手工加锁语句。
(二)For Update有什么特点?
Mysql中For update仅适用于Innodb, 且必须在事务处理模块(BEGIN/COMMIT)中才能生效 。Postgresql的话可以直接使用(下面会使用案例说明)
For Update虽然是行级锁,但是并不所有的情况下都只锁行,某些情况下也会将整个表锁住
常见的锁表情况如下(假设存在某个表user,主键为:id):
(1)查询不明确指定主键,如:(注意时测试时需要开启事务)
select * from user for update; // 锁住整个表
select * from user where id 3 for update; // 锁住整个表
......
(2)查询中没有主键的时候,如:
select * from user where name = 'abc' for update;// 锁住整个表
......
常见的不锁表情况如下(假设存在某个表user,主键为:id):
(1)明确指定主键,且数据存在时,如:(注意时测试时需要开启事务)
select * from user where id= 3 for update; // 锁住ID为3的行数据
(2)明确指定主键,但数据不存在时,如
select * from user where id= 30000 for update; // 没有锁
测试提示: 可以利用MySQL的Command Mode(命令模式) ,开两个视窗来做测试。
原创文章 51获赞 75访问量 2万+
关注
私信
展开阅读全文
作者:谁修改了我的Bug
weixin_38501826
- 粉丝: 9
- 资源: 893
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0