MySQL 的乐观锁和悲观锁了解吗?
悲观锁认为它保护的数据是非常敏感的,每时每刻都有可能被改动,一个事务在拿到悲观锁后,其他事务不能对该数据进行修改,直到它提交或回滚后。
MySQL 中的行锁、表锁都是悲观锁。
乐观锁则认为数据的变动不会太频繁。通常通过版本号(version)或者时间戳(timestamp)来实现。
事务拿到数据后,会将数据的版本号也取出来(比如说标记为 v1),当数据变动完想要更新到表中时,会将最新的版本 v2 和 v1 进行对比,如果 v1=v2,说明在数据变动期间,没有其他事务对数据进行修改。
此时,事务提交就会成功,并且 version 会加 1,以此来表明数据已变动。
如果 v1 不等于 v2,说明数据变动期间,数据被其他事务修改了,此时需要通知用户重新操作。
悲观锁是 MySQL 自带的,而乐观锁通常需要开发者自己去实现。
THE END
暂无评论内容