mysql悲观锁和乐观锁

一、悲观锁

1、排它锁,当事务在操作数据时把这部分数据进行锁定,直到操作完毕后再解锁,其他事务操作才可操作该部分数据。这将防止其他进程读取或修改表中的数据。

2、实现:大多数情况下依靠数据库的锁机制实现

一般使用 select ...for update 对所选择的数据进行加锁处理,例如select * from account where name=”Max” for update, 这条sql 语句锁定了account 表中所有符合检索条件(name=”Max”)的记录。本次事务提交之前(事务提交时会释放事务过程中的锁),外界无法修改这些记录。

如果对“select *from student where id = 931 for update”使用了悲观锁,所以此时的所有该表的所有数据更新(不过我们需要注意一些锁的级别,MySQL InnoDB默认行级锁。行级锁都是基于索引的,如果一条SQL语句用不到索引是不会使用行级锁的,会使用表级锁把整张表锁住,这点需要注意。)操作不会写入到数据库。

二、乐观锁

1、如果有人在你之前更新了,你的更新应当是被拒绝的,可以让用户重新操作。

2、实现:大多数基于数据版本(Version)记录机制实现

具体可通过给表加一个版本号或时间戳字段实现,当读取数据时,将version字段的值一同读出,数据每更新一次,对此version值加一。当我们提交更新的时候,判断当前版本信息与第一次取出来的版本值大小,如果数据库表当前版本号与第一次取出来的version值相等,则予以更新,否则认为是过期数据,拒绝更新,让用户重新操作。

读取表中的某一条记录,保存该记录的版本号字段数据,当进行写入操作的,又一次读取该记录并比较版本字段的数据是否与之前读取的相同,如果相同则执行更新操作并将版本号加一操作,如果不相同则禁止更新操作,重新读取该字段数据并重复之前的操作。

乐观锁并不是一种具体的技术,而是一种处理逻辑或者是一种思想。

使用场景: 乐观锁适用于冲突比较少的场景,如果冲突比较频繁则会增加访问压力,这个时候应该使用悲观锁。

没有更多推荐了,返回首页