Skip to main content

事务相关实验

观察默认情况下,innodb的事务情况

  1. 我们先看一下默认事务隔离级别是什么,使用 select @@transaction_isolation 命令
> select @@transaction_isolation

@@transaction_isolation|
-----------------------+
REPEATABLE-READ |

我们看到默认的隔离级别是 可重复读,那就是在一个事务中,读到的数据应该是一样的。

  1. 我们先开启一个事务A,并查询 student 表的记录
> start transaction

0 row(s) modified.

> select * from student

id|name|
--+----+
1|张三 |
3|李四 |

2 row(s) fetched.
  1. 我们在另一个session中开启一个事务B,并写入一条记录
> start transaction

0 row(s) modified.

> insert into student values (10,'王五')

1 row(s) modified.
  1. 回到事务A,我们再查一次,还是2条记录
> select * from student

id|name|
--+----+
1|张三 |
3|李四 |

2 row(s) fetched.
  1. 提交事务B,让记录正式写入
> commit

0 row(s) modified.
  1. 回到事务A,再查一次,还是2条记录
> select * from student

id|name|
--+----+
1|张三 |
3|李四 |

2 row(s) fetched.
  1. 提交事务A,再查一次,这次变成3行了
> commit

0 row(s) modified.


> select * from student

id|name|
--+----+
1|张三 |
3|李四 |
10|王五 |

3 row(s) fetched.

小结:在默认的情况下,MySQL事务的隔离级别是 REPEATABLE-READ,可重复读。也就是说在事务内,多次读取,会获取到一样的数据,哪怕有别的事务对数据进行了操作并提交,并不影响原来已开启的事务。

我发现 在事务中使用truncate去删除数据的时候,rollback是不生效的。一定要小心