mysql版本
select version();
开始一个事务,并且不提交不回滚
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
表中无数据
此时,查看INNODB_TRX表
表中多了一条事务
这边再创建一个事务,之前的事务不结束
start transaction;
insert into `next_key_lock_test`(`id`,`a`,`b`,`c`) VALUES (99,99,99,99);
这边多了一条数据
同时,我们发现事务二被锁住了,处于wait状态,什么都执行不了了。
再加入事务3
start TRANSACTION
select * from `next_key_lock_test` for update;
start TRANSACTION
select * from `next_key_lock_test` ;
分别测试两种情况,快照读和当前读。
发现当前读的事务同样会变成等待状态,会产生一个锁。
这边需要注意,加锁,是有超时时间,有可能出现
的情况,代码需要处理这种情况。
同时还有几张表可以关注下, 在performance_schema下的events_transactions_current、events_transactions_history、events_transactions_history_long
一些命令
查看隔离级别
select @@transaction_isolation;
默认一般是RR
查看是否自动commit
SHOW VARIABLES LIKE 'autocommit';
更改commit
SET autocommit = 1;
查询进程
SHOW PROCESSLIST;