多用户同时修改一条数据  ,并发问题
多用户同时修改一条数据  ,并发问题
什么是程序员 发表于1年前
多用户同时修改一条数据  ,并发问题
  • 发表于 1年前
  • 阅读 491
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 技术升级10大核心产品年终让利>>>   

 

如果两个用户同时打开一条记录,修改后提交会产生更新冲突

办法有三:

1.打开同时锁定表的记录 

2.用lock对修改方法加锁

2.捕获错误,撤消其中一个用户的修改

 

场景描述如下:

用户A、B同时打开一个页面,页面显示,客户表T_CUSTOMER字段(C_NAME、C_AGE)

姓名:张三,年龄:25

1,A 将姓名“张三”改为“张三1”,然后保存

2,B 将年龄“25”改为“30”,然后保存

这样A的操作就被覆盖了,姓名又变回“张三”了

 

解决方案

方法一:

锁表,但是被锁的表可以被查询   却不能增,删,改表,虽能够防止丢失更新和不可重复写这类并发问题,但是它会影响并发性能

 

方法二:

在业务代码中用lock对修改方法加锁,运行时注入单例,并且对方法加同步锁,保证了业务数据的正确性, 但是效率低下,用户在使用中不方便,背离了系统可以并发操作的原则

 

方法三:

数据校验机制,不做数据库层次上的锁定

给表添加一字段:LAST_UPDATE,即最后更新时间

姓名:张三,年龄:25,LAST_UPDATE:2016-06-17 13:45:00

 

1,A 将姓名“张三”改为“张三1”,然后保存

更新数据时WHERE条件里多一条件:AND LAST_UPDATE = '2016-06-17 13:45:00'

修改记录时同时将当前时间“2016-10-17 13:46:00”赋值给LAST_UPDATE字段,更新成功

2,B 将年龄“25”改为“30”,然后保存

B更新数据时WHERE条件里也有这个条件:AND LAST_UPDATE = '2016-06-17 13:45:00',此时LAST_UPDATE的值已经在A修改记录时变成2016-06-17 13:46:00

下面要做的就是给出提示了:该记录读出后已经被再次修改

 

备注:如果A读了数据,未来及更新,B先更新了数据, 那么A将提交不上数据,因为LAST_UPDATE 已经失效,这样就造成了A重新读取数据,重新填写表单信息。 这也是乐观锁一个缺点,可以在更新前临时保存A填写的数据,再在跳转页中加载这些数据,保证了用户不用麻烦再次输入这些数据,更新成功则清空这些临时数据

共有 人打赏支持
粉丝 4
博文 66
码字总数 4194
×
什么是程序员
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: