序言
乐观锁是相对于悲观锁而言的。悲观锁大多数情况下是依靠数据库的锁机制实现的,悲观锁影响数据库的性能,而乐观锁是基于数据库版本记录机制来实现的。何谓数据库版本?即为数据库增加一个版本表示的字段,在读取数据的时候将版本号一同读出,在数据更细后,对此版本号加一。然后将提交的版本数据跟数据表对应记录信息进行对比,如果提交的数据版本号大于数据表的版本号,则更细。都这认为是过期数据
简言之:乐观锁和悲观锁是抽象的存在,并没有实际的锁,乐观锁就是没有使用实际的锁,而悲观锁使用了实际的锁,比如共享锁,排它锁
解决问题
在并发时,对于多个进程操作同一数据的操作,例如秒杀,修改库存情况
实现代码
// 乐观锁 // alter table count add column version char(20) default 0; $prefix = 'd1d'; $sql = 'select * from count where prefix = "dz10021"'; $data1 = $db->query($sql); $data2 = $db->query($sql); var_dump('===>>>> data 1'); var_dump($data1); var_dump('===>>>> data 2'); var_dump($data2); // 修改数据 1 $sql1 = 'update count set count = 13,version = version + 1 where prefix = "dz10021" and version = '.$data1['version']; var_dump($db->execute($sql1)); // 修改数据 2 $sql2 = 'update count set count = 14,version = version + 1 where prefix = "dz10021" and version = '.$data2['version']; var_dump($db->execute($sql2));
分析代码
