MYSQL乐观锁实现
- 对于按钮等控件,点击后使其立刻失效,不让用户重复点击,避免对同时对同一条记录操作。
- 使用乐观锁进行控制。乐观锁大多是基于数据版本(Version)记录机制实现。即为数据增加一个版本标识,在基于数据库表的版本解决 方案中,一般是通过为数据库表增加一个“version”字段来实现。读取出数据时,将此版本号一同读出,之后更新时,对此版本号加一。此时,将提交数据 的版本数据与数据库表对应记录的当前版本信息进行比对,如果提交的数据版本号大于数据库表当前版本号,则予以更新,否则认为是过期数据。
- 乐观锁机制避免了 长事务中的数据库加锁开销(用户A和用户B操作过程中,都没有对数据库数据加锁),大大提升了大并发量下的系统整体性能表现。hibernate 在其数据访问引擎中内置了乐观锁实现。
- 需要注意的是,由于乐观锁机制是在我们的系统中实现,来自外部系统的用户更新操作不受我们系统的控制,因此可能会造成脏数据被更新到数据库中。
- 核心sql代码:
UPDATE TABLE
SET x = x + 1,
version = version + 1
WHERE
id = {id} and version={version};
个人总结:
- java的乐观锁和mysql乐观锁实现很接近;
- 都是用一个当前值V(version_now),预期值A(version_perdict),修改值B(version_update);
- 预期值A等于当前值V,就将当前值修改为B;