MySQL乐观锁和悲观锁具体实现

文 / @WordPress主题

MySQL乐观锁和悲观锁具体实现

在MySQL中,锁按照范围主要分为表锁、行锁和页面锁。乐观锁和悲观锁可以按照思想分。

悲观锁是比较消极的一种锁处理方式,会在操作数据时,抢占锁,其他事务需要等待直到占有锁的事务释放锁。这种处理方式可以保证数据的最大一致性,但是容易导致锁超时、并发程度低等问题。

举个例子,假设我们有一个用户表`user`,并且我们需要对其进行更新。我们可以使用以下命令进行更新:

```
BEGIN;
UPDATE `user` SET name='张三111111' WHERE id=1;
```

此时我们没有提交事务,然后开启另一个事务进行更新操作:

```
BEGIN;
UPDATE `user` SET sex=1 WHERE id=1;
```

此时,该事务需要等待第一个事务释放锁之后才能继续操作,也就是说,悲观锁会降低系统的吞吐量和效率。

而乐观锁则比较积极,它认为数据一般情况下不会造成冲突,只有当数据去执行修改操作时,才会针对冲突进行处理。通常情况下,乐观锁主要通过在数据行上加一个版本号或者时间戳等字段来判断是否发生冲突。

乐观锁的实现原理是,在事务读取数据时,将对应的版本号字段读取出来,然后进行更新操作时,针对业务数据做条件,并默认增加一个版本号作为where条件。如果版本号与读取时读到的版本号不一致,则执行失败。通过这种方式来达到锁的功能。

以下是关于MySQL中乐观锁和悲观锁的具体实现演示:

建立表结构:

CREATE TABLE `demo`.`user`(
`id` int(10) UNSIGNED ZEROFILL NOT NULL AUTO_INCREMENT,
`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
`sex` tinyint(1) UNSIGNED NOT NULL DEFAULT 0,
`email` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL,
`mobile` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL,
`version` int(1) NULL DEFAULT 1 COMMENT '数据版本号',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=8 CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ROW_FORMAT=Dynamic;

插入数据:

BEGIN;
INSERT INTO `user` VALUES (0000000001, '张三', 0, '18228937997@163.com', '18228937997', 1);
INSERT INTO `user` VALUES (0000000002, '李四', 0, '1005349393@163.com', '15683202302', 1);
INSERT INTO `user` VALUES (0000000003, '李四1', 0, '1005349393@163.com', '15683202302', 1);
INSERT INTO `user` VALUES (0000000004, '李四2', 0, '1005349393@163.com', '15683202302', 1);
INSERT INTO `user` VALUES (0000000005, '李四3', 0, '1005349393@163.com', '15683202302', 1);
INSERT INTO `user` VALUES (0000000006, '李四4', 0, '1005349393@163.com', '15683202302', 1);
INSERT INTO `user` VALUES (0000000007, '李四55', 0, '1005349393@163.com', '15683202302', 1);
COMMIT;

悲观锁:

假设我们要更新id为1的数据,并且不提交事务:

```
BEGIN;
UPDATE `user` SET name='张三111111' WHERE id

添加UTHEME为好友
扫码添加UTHEME微信为好友
· 分享WordPress相关技术文章,主题上新与优惠动态早知道。
· 微信端最大WordPress社群,限时免费入群。