MySQL/Transaction

维基教科书,自由的教学读本

Innodb开始支持事务。默认是自动提交,除非显式地开始一个事务,否则每个查询都被当做一个单独的事务自动执行。

set autocommit=0 设置事务非自动提交。自此句执行以后,每个SQL语句或者语句块所在的事务都需要显示"commit"才能提交事务。

通过以下命令可以查看当前autocommit模式

 show variables like 'autocommit';
 select @@autocommit;

注意事项:

  • 不管autocommit 是1还是0 ,START TRANSACTION 后,只有执行了commit数据才会生效,ROLLBACK就会回滚。
  • 当autocommit 为 0 时,不管有没有START TRANSACTION,只有执行了commit数据才会生效,ROLLBACK后就会回滚。关闭了数据库连接并不会自动提交。
  • 当autocommit 为1是 ,且没有START TRANSACTION,则调用ROLLBACK是没有用的,即便设置了SAVEPOINT。


  • 脏读:一个事务读取到了另一个事务未提交的数据,这是特别危险的,要尽力防止。
  • 不可重复读:在一个事务内读取表中的某一行数据,多次读取结果不同。(一个事务读取到了另一个事务已经提交的数据:增加记录、删除记录、修改记录),在某写情况下并不是问题,在另一些情况下就是问题。
  • 虚读:是指在一个事务内读取到了别的事务插入的数据,导致前后读取不一致。(一个事务读取到了另一个事务已经提交的数据---增加记录、删除记录),在某写情况下并不是问题,在另一些情况下就是问题。

四个隔离级别:

  • Serializable:可避免脏读、不可重复读、虚读情况的发生。(串行化)
  • Repeatable read:可避免脏读、不可重复读情况的发生。(可重复读)不可以避免虚读
  • Read committed:可避免脏读情况发生(读已提交)
  • Read uncommitted:最低级别,以上情况均无法保证。(读未提交)


  • 安全性考虑:Serializable>Repeatable read>Read committed>Read uncommitted
  • 数据库效率:Read uncommitted>Read committed>Repeatable read>Serializable

一般情况下,我们会使用Repeatable read、Read committed

mysql数据库默认的数据库隔离级别Repeatable read

mysql中设置数据库的隔离级别语句:

set [global/session] transaction isolation level xxxx;

mysql中设置数据库的隔离级别语句:

select @@tx_isolation;