MySQL事务并发问题的介绍

  • 对于同时运行的多个事务,当这些事务访问数据库相同的数据时,如果没有采取必要的隔离机制,就会导致各种并发问题:

    脏读:对于两个事务T1,T2,T1读取了已经被T2更新但还没有被提交的字段。之后,若T2回滚,T1读取的内容就是临时且无效的。

    不可重复读:对于两个事务T1,T2,T1读取了一个字段,然后T2更新了该字段。之后, T1再次读取同一个字段,T1再次读取同一个字段,值就不同了。

    幻读:对于两个事务T1,T2,T1从一个表种读取一个字段,然后T2在该表种插入了一些新的行,如果T1再次读取同一个表,就会多出几行。


  • 数据库事务的隔离性:数据库系统必须具有隔离并发运行各个事务的能力,使他们不会互相影响,避免各种并发问题。

  • 数据库提供的4种事务隔离级别:

隔离级别 描述
READ UNCOMMTTED(读未提交的数据) 允许事务读取未被其他是位于提交的变更、脏读,不可重复读和幻读的问题都会出现
READ COMMITED(读已提交数据) 只允许事务读取已经被其他事务提交的变更,可以避免脏读,但不可重读和幻读问题仍然会出现
REPEATABLE READ(可重复读) 确保事务可以多次从一个字段中读取相同的值,在这个事务持续期间,禁止其他事务对这个字段进行更新,可避免脏读和不可重复读,但幻读的问题仍然存在。
SERIALLIZABLE(串行化) 确保事务可以从一个表种读取相同的行,在这个事务持续期间,禁止其他事务对该表执行插入,更新和删除操作,所有并发问题都可以避免,但性能十分低下。
  • Oracle支持2种事务隔离级别:READ UNCOMMTTED,SERIALLIZABLE。Oracle默认的事务隔离级别为:READ UNCOMMTTED

  • Mysql支持4种事务隔级别,Mysql默认事务隔离级别为:READ UNCOMMTTED


  • 每启动一个mysql程序,就会获得一个单独的数据库连接。每个数据库连接都有一个全局变量@@tx_isolation,表示当前的事务的隔离级别。

  • 查看当前隔离级别:SELECT @@tx_isolation;

  • 设置当前Mysql连接的隔离级别

    *set transaction isolation level read committed;

  • 设置数据库的全局的隔离级别:

    *set global transaction isolation level read committed;

推荐阅读更多精彩内容