为了账号安全,请及时绑定邮箱和手机立即绑定

mysql事务隔离的问题?多线程并发怎么保证可靠?

mysql事务隔离的问题?多线程并发怎么保证可靠?

江户川乱折腾 2019-03-13 14:14:52
mysql采用默认事务隔离级别REPEATABLE-READ;然后我分别执行以下内容:1、2、使用jdbc访问数据库:3、这时候打印结果,发现线程进入阻塞,一直卡在这里也就是说我开启的另一个事务仍然能读取到数据,只是在最后执行executeUpdate的时候才被锁定不能执行4、命令行执行commit5、结果命令行操作被jdbc操作替换掉,数据改为4。这不就是说REPEATABLE-READ仍然出现了丢失更新,而且没有行锁定吗?事务与并发到底是什么区别,我在测试多线程执行以上jdbc操作时,发现最后得到的结果总是不对。例我开十个线程,每个都对数据+1,结果可能只加了5.所以在并发情况下怎么做才能保证数据的安全?
查看完整描述

4 回答

?
慕雪6442864

TA贡献1812条经验 获得超5个赞

如果是单纯的Select会被看做是单纯的查询操作,所以不会被挂起。
如果要对某行进行事务,应该先在Select时就使用Select ... For Update这种格式。
使用For Update会对所选择的行加锁,当另外的事务再进行时,会在那个事务的Select ... For Update时就挂起,等待当前事务完成后才会继续执行。这样才能保证查询和写入之间没有中间者。

查看完整回答
1 反对 回复 2019-04-18
?
炎炎设计

TA贡献1808条经验 获得超4个赞

REPEATABLE-READ是有可能出现幻读的
如果你要保证绝对的安全只能把隔离级别设置成SERIALIZABLE
这样所有事务都只能顺序执行,自然不会因为并发有什么影响了,但是性能会下降许多。

如果你既不想性能下降又想控制让他不出错,现在比较常用的做法是,使用更新的版本控制。
维护一个字段作为UpdateVersion,修改时updateversion也作为一个参数传入,在条件语句中添加例如where id=? and update_version = ? 当然set里面要update_version+1。
这样可以控制到每次只能有一个人更新一个版本。


查看完整回答
反对 回复 2019-04-18
  • 4 回答
  • 0 关注
  • 1105 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号