文章目录
- 前言
- 一、问题
- 二、测试
- 2.1.RR级别,mysql默认级别
- 2.1.1 打开一个mysql窗口,事务A
- 2.1.2 打开另一个窗口,事务B
- 2.1.3 提交事务A,再看结果如下
- 2.2 READ-COMMITTED 级别下测试
- 2.2.1修改数据库的my.ini文件修改隔离级别
- 2.2.2 查看隔离级别是否已经修改
- 2.2.3 开始事务A
- 2.2.4开始事务B
- 2.2.5 查看结果
- 2.2.6 commit事务A,然后查看结果
- 2.3 READ-UNCOMMITTED下测试
- 2.3.1 代码如下
- 2.3.2 查看结果
- 2.4 SERIALIZABLE下测试
- 2.4.1 代码
- 2.4.2 查看结果
- 总结
前言
面试中问到了相关问题,做下问题记录
一、问题
问题是这样的,数据库默认隔离级别下,事务A插入一条数据,没有提交,事务B插入一条数据,提交,表id为自增,如果表是空表,事务A和事务B的id分别是多少。
二、测试
2.1.RR级别,mysql默认级别
2.1.1 打开一个mysql窗口,事务A
执行代码块
start transaction;
insert into a(age) value(1);
2.1.2 打开另一个窗口,事务B
执行
start transaction;
insert into a(age) value(2);
commit;
查看结果如下
2.1.3 提交事务A,再看结果如下
可以看到事务A的id是1,事务B的id是2,和先后commit没有关系。
2.2 READ-COMMITTED 级别下测试
2.2.1修改数据库的my.ini文件修改隔离级别
transaction-isolation=READ-COMMITTED
重启mysql
2.2.2 查看隔离级别是否已经修改
查看隔离级别命令
show variables like 'transaction_isolation';
可以看到已经生效了。
2.2.3 开始事务A
start transaction;
insert into a(age) value(3);
2.2.4开始事务B
start transaction;
insert into a(age) value(4);
commit;
2.2.5 查看结果
2.2.6 commit事务A,然后查看结果
可以看到rc级别下和rr级别是一样的。
2.3 READ-UNCOMMITTED下测试
2.3.1 代码如下
事务A
start transaction;
insert into a(age) value(5);
事务B
start transaction;
insert into a(age) value(6);
commit;
2.3.2 查看结果
可以看到已经都插入了,commit事务A也是一样的,并且顺序是事务A到事务B,id增长。
2.4 SERIALIZABLE下测试
2.4.1 代码
事务A
start transaction;
insert into a(age) value(7);
事务b
start transaction;
insert into a(age) value(8);
commit;
2.4.2 查看结果
commit事务A后看结果
可以看到一样是先开始事务的id先加一。
总结
1.mysql的数据库自增id和数据库的隔离级别没有关系,都是只要开始了事务,id就会增加1,后面的事务再执行就在原来的基础上加1。
2.oracle 前同事测试和mysql不一样,是谁先提交谁加1,这个我没有测试过,刚兴趣的可以自己测试下。