若是两个用户同时打开一条记录,修改后提交会产生更新冲突数据库
办法有三:并发
1.打开同时锁定表的记录 性能
2.用lock对修改方法加锁spa
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填写的数据,再在跳转页中加载这些数据,保证了用户不用麻烦再次输入这些数据,更新成功则清空这些临时数据