活动地址:毕业季·进击的技术er
职场 内卷人
在企业级开发过程中我发现有位同事用select * from where 条件 for update好吧! 今天我就学习了一手 顺便发个帖子。嘿嘿
本人借鉴的文章菜鸟教程-MySQL 事务
面试官问: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 中的事务的传播特性 都是面试常考点
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
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OPLNv5n5-1655994728162)(https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/4af5d417b96646b0a4a1430460b7d594~tplv-k3u1fbpfcp-watermark.image?)]
看图 由此可见是锁行活动地址:毕业季·进击的技术er



