MySQL乐观锁和悲观锁具体实现
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

-
MySQL Workbench怎么建立数据库(附:sql语句创建数据库方法) 2023-07-20 12:22:29
-
MySQL Workbench是什么?(附:如何设置中文教程) 2023-07-20 11:42:31
-
mysql驱动是什么 2023-05-14 07:00:03
-
MySQL 语法整理介绍 2023-05-14 07:00:03
-
mysql怎么将查询结果赋给变量 2023-05-14 07:00:03
-
qt5.8如何连接mysql 2023-05-14 07:00:03
-
mysql乐观锁和悲观锁的区别是什么 2023-05-14 07:00:03
-
一起聊聊MySQL主从延时的处理方案 2023-05-14 07:00:03
-
mysql修改表结构的语句是什么 2023-05-14 07:00:03
-
mysql connector 怎么安装 2023-05-14 07:00:02