- 持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第16天,点击查看活动详情
在企业级开发过程中我发现有位同事用select * from where 条件 for update
好吧! 今天我就学习了一手 顺便发个帖子。嘿嘿
本人借鉴的文章
面试官问:select......for update会锁表还是锁行?
开始巴!嘿嘿
看一段sql,感觉一下是不是很懵逼 可能也会有大佬
BEGIN;
SELECT * FROM a WHERE `key`=1 FOR UPDATE;
UPDATE a SET `name`='songxy9991' WHERE `key` =1;
COMMIT;
SELECT @@autocommit;
SET @@autocommit =0;
SELECT * FROM a WHERE `key`=1 FOR UPDATE;
COMMIT;
UPDATE a SET `name`='songxy12' WHERE `key` =1;
我们一个一个的说明
- 讲到这里 我们就会说到 事务这个 神圣而又伟大。要么成功要么都不成功。原则性、一致性、隔离性、持久性。等等巴,还有事务的隔离级别,还有spring 中的事务的传播特性 都是面试常考点
BEGIN
就是开启事务
COMMIT;
提交事务
SELECT @@autocommit;
查看事务是否静止自动提交事务
autocommit 状态值说明
- AUTOCOMMIT=0 禁止自动提交
- AUTOCOMMIT=1 开启自动提交 修改状态:
- SET AUTOCOMMIT=0 禁止自动提交
- SET AUTOCOMMIT=1 开启自动提交 MySQL数据库默认会是 自动开启事务的
这边我们就 不让他自动提交事务 给他先禁止掉
SET @@autocommit =0;
SELECT @@autocommit;
真功夫开始了 哈
- 建表语句
DROP TABLE IF EXISTS `a`;
CREATE TABLE `a` (
`key` int(0) NOT NULL AUTO_INCREMENT,
`value` char(225) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
PRIMARY KEY (`key`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of a
-- ----------------------------
INSERT INTO `a` VALUES (1, 'ssss', 'songxy12');
INSERT INTO `a` VALUES (2, 'yy', 'songxy');
INSERT INTO `a` VALUES (3, 'sxy', 'songxy');
INSERT INTO `a` VALUES (4, '1111', 'songxy');
INSERT INTO `a` VALUES (5, 'qqq', 'songxy');
SET FOREIGN_KEY_CHECKS = 1;
先看一下我之前表数据
先通过主键查
SELECT * FROM a WHERE `key`=1 FOR UPDATE;
执行这个sql 我可没有 COMMIT;哈
在执行
UPDATE a SET `name`='songxy999' WHERE `key` =1;
去查表数据
- 没有发生改变
执行提交事务的语句
COMMIT;
- 到底锁的行还是 表 我来试试
- 报错了;error