乐观锁(所有用户都可以读取和修改,通过版本控制谁的修改有效)。
当先执行查询在执行修改的时候就会出现并发数据,会修改相同数据,导致结果不对。
select * from order where id = 1; update order set num = num+1 where id = 1;
并发时,同时查出来的num结果为1;修改的时候num都是相同值,一条执行结果未修改;
采用乐观锁来解决该方式:
在数据库表字段增添版本控制,或者直接使用修改时间字段作为参数。(时间字段的好处就是每次修改成功 自动更新修改时间字段则可以不用在sql中加入修改了。)
order表:
id num version update_time
select * from order where id = 1; update order set num = num + 1,version = version+1 where id = 1 and version = 1; select * from order where id = 1; update order set num = num + 1,version = version+1 where id = 1 and version = 1;
并发时,同时查出来的num结果为1,version结果为1,由于第一条sql修改已经执行。数据库实际version的结果为2了。第二条sql修改则失败。
结论: 由于第一条修改SQL已经执行,这个时候已经开启了乐观锁,所以第二条修改sql则执行失败。