mysql事务探究

mysql版本

select version();


image.png

开始一个事务,并且不提交不回滚

DROP TABLE IF EXISTS `next_key_lock_test`;
CREATE TABLE `next_key_lock_test`  (
  `id` int(0) NOT NULL AUTO_INCREMENT,
  `a` bigint(0) NULL DEFAULT NULL COMMENT '唯一索引',
  `b` bigint(0) NULL DEFAULT NULL COMMENT '普通索引',
  `c` bigint(0) NULL DEFAULT NULL COMMENT '不带索引',
  PRIMARY KEY (`id`) USING BTREE,
  UNIQUE INDEX `a`(`a`) USING BTREE,
  INDEX `b`(`b`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

start transaction;
insert into `next_key_lock_test`(`id`,`a`,`b`,`c`) VALUES (1,1,1,1);
insert into `next_key_lock_test`(`id`,`a`,`b`,`c`) VALUES (5,5,5,5);
insert into `next_key_lock_test`(`id`,`a`,`b`,`c`) VALUES (10,10,10,10);
insert into `next_key_lock_test`(`id`,`a`,`b`,`c`) VALUES (20,20,20,20);
insert into `next_key_lock_test`(`id`,`a`,`b`,`c`) VALUES (40,40,40,40);

再次插入id为1的数据

next_key_lock_test
image.png

image.png

表中无数据

此时,查看INNODB_TRX表

image.png

表中多了一条事务

这边再创建一个事务,之前的事务不结束

start transaction;
insert into `next_key_lock_test`(`id`,`a`,`b`,`c`) VALUES (99,99,99,99);
image.png

这边多了一条数据
同时,我们发现事务二被锁住了,处于wait状态,什么都执行不了了。

再加入事务3

start TRANSACTION
select * from `next_key_lock_test` for update;

start TRANSACTION
select * from `next_key_lock_test` ;

分别测试两种情况,快照读和当前读。
发现当前读的事务同样会变成等待状态,会产生一个锁。


image.png

这边需要注意,加锁,是有超时时间,有可能出现


image.png

的情况,代码需要处理这种情况。

同时还有几张表可以关注下, 在performance_schema下的events_transactions_current、events_transactions_history、events_transactions_history_long

一些命令

查看隔离级别

select @@transaction_isolation;


image.png

默认一般是RR
查看是否自动commit
SHOW VARIABLES LIKE 'autocommit';
更改commit
SET autocommit = 1;
查询进程
SHOW PROCESSLIST;

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容