MySQL乐观锁是数据库事务性技术中重要的一种。它是乐观型分布式锁,有用于控制并发访问。它是通过对比版本号来防止资源多次更新。在本文中,我们将介绍MySQL乐观锁的一个简单实例,以帮助大家更好的理解这种技术。
首先,介绍MySQL乐观锁的原理,乐观锁使用一个数值类的版本变量来表示数据的稳定性。每当应用程序请求去更新一个数据时,会将当前数据的版本号和新的数据拷贝传给数据库,而数据库将会将拷贝后的数据先存储在内存中,然后查询当前数据库中改数据库的版本号,如果两者相等,则更新成功;但如果不相等,则认为有其他操作较先拿到锁,将中止更新,并重新向数据库请求最新版本的数据,然后再重新执行更新操作。
下面我们看一个简单的MySQL乐观锁的实例,假设有一个表users,用来保存两种不同用户的数据,它有一个数据版本变量version用来表示每条记录的数据的当前版本号。
create table users (
id int not null,
name varchar(30) not null,
gender char(1) not null,
version int not null
)
假设现在有两个用户:比如A和B,他们同时更新名为John的user的数据。如果用传统的悲观锁,则A和B在取得同一记录之前必须都获得该记录的排他锁,这将导致一个用户必须等待几秒钟来获得该锁,期间也许其他用户已经更新了该记录,于是A和B都需要重新获取最新的数据。
相反,如果用MySQL乐观锁,则A和B在请求想要更新的数据时,将会先拿到该记录的当前版本变量version,然后和该记录存储在内存中的版本变量进行比对,如果两者相等,则代表其他用户在这段时间内没有做更新,于是A和B都可以更新成功;但如果不相等,则表示有其他用户较先拿到锁,但A和B都可以参照最新版本变量重新向数据库请求最新版本的数据,然后再重新执行更新操作。
以上便是MySQL乐观锁的一个简单实例,经过简单的分析过后,大家应该都能体会到乐观锁的优势:就是比悲观锁更加高效、幂等性安全,并且在多并发环境下实现一致性更新,但是它也有一个缺点:不如悲观锁可靠,容易出现“脏写”的情况,所以使用者必须根据实际场景选择合适的加锁方式。