创建表结构

  1. CREATE TABLE `user` (
  2. `id` int(11) NOT NULL AUTO_INCREMENT,
  3. `name` varchar(45) DEFAULT NULL,
  4. `age` int(11) DEFAULT NULL,
  5. `text` varchar(45) DEFAULT NULL,
  6. PRIMARY KEY (`id`),
  7. KEY `idx_name` (`name`),
  8. KEY `idx_age` (`age`),
  9. KEY `idx_name_age` (`name`,`age`)
  10. ) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=latin1;

初始化数据

  1. INSERT INTO `test_isolation`.`user` (`name`, `age`, `text`) VALUES ('a', '10', 'a');
  2. INSERT INTO `test_isolation`.`user` (`name`, `age`, `text`) VALUES ('b', '20', 'b');
  3. INSERT INTO `test_isolation`.`user` (`name`, `age`, `text`) VALUES ('c', '30', 'c');
  4. INSERT INTO `test_isolation`.`user` (`name`, `age`, `text`) VALUES ('d', '40', 'd');
  5. INSERT INTO `test_isolation`.`user` (`name`, `age`, `text`) VALUES ('e', '50', 'e');

T1 - 设置隔离级别

READ COMMITTED

  1. SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
  2. select @@global.transaction_isolation,@@transaction_isolation;

image.png

T2 - 设置隔离级别

READ COMMITTED

  1. SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
  2. select @@global.transaction_isolation,@@transaction_isolation;

image.png

T1 - 事务1开启

T1第一次查询

  1. start transaction;
  2. SELECT * FROM test_isolation.user;

image.png

T2 - 事务2开启

  • 插入一条没有提交的数据f

    1. start transaction;
    2. INSERT INTO test_isolation.user (`name`, `age`, `text`) VALUES ('f', 60, 'f');
    3. SELECT * FROM test_isolation.user;

    image.png

  • 或删除一条没有提交的数据a

    1. start transaction;
    2. DELETE FROM test_isolation.user where id = 1;
    3. SELECT * FROM test_isolation.user;

    image.png

  • 或更新一条没有提交的数据b

    1. start transaction;
    2. UPDATE test_isolation.user SET name = "B" WHERE id = 2;
    3. SELECT * FROM test_isolation.user;

    image.png

    T1 - 第2次查询

    事务1无法读到了事务2尚未提交的数据f,READ COMMITED避免了脏读

    1. SELECT * FROM test_isolation.user;

    image.png

    T2 - 事务2提交

    image.png

T1 - 第3次查询

  • 事务1读到了事务2提交插入的数据f,READ COMMITED避免了脏读,但是不能阻止不可重复读(在同一个事物中的多次查询结果不一致)

    1. SELECT * FROM test_isolation.user;

    image.png

  • 事务1发现事务2删除了数据a,READ COMMITED避免了脏读,但是不能阻止不可重复读(在同一个事物中的多次查询结果不一致)

**
image.png

  • 事务1发现事务2更新了数据b,READ COMMITED避免了脏读,但是不能阻止不可重复读(在同一个事物中的多次查询结果不一致)

**
image.png