mysql事务隔离级别

SQL中定义了4中隔离级别,不同的隔离级别对应着事务中做不同的修改,同时在事务内和事务间的可见性也不同。越低的隔离级别越能支持更高的并发,对系统的开销也越低。

四种隔离级别:

1. read uncommitted (未提交读)

      在read uncommitted 级别中,在事务中的修改即使事务未提交,其他同时的事务也是可见的,其他事务也可以读取到该修改数据,出现数据“脏读”的情况。因此  read uncommitted 在实际项目中很少使用。

2. read committed (提交读)

        在read committed级别中,一个事务从开始直到事务提交之前,其他的事务对该事务的修改都是不可见的。这个级别同时也叫做不可重复读,因为两次执行同样的查询,可能会不同的结果。

        其他大多数的数据库默认的隔离级别都是read committed ,但是mysql 默认隔离级别不是。

3. repeatable read (可重复读)

        repeatable read级别是mysql 默认的事务隔离级别。该级别确保了在一个事务中多次读取结果是一致的,但同时也出现另一个“幻读”的问题。“幻读”是指当某个事务在读取某个范围内的记录时另一个事务又在该范围内插入了新的数据,那么再次读取该范围的数据时会出现幻行。所以最终MySQL在存储引擎(InnoDB和XtraDB)通过多版本并发控制(MVCC)解决幻读的问题。

        因此也是MySQL 中默认使用的事务隔离级别,同时需要使用事务时一般使用InnoDB存储引擎。

4. serializable (可串行化)

        serializable通过强制事务串行执行,在事务对读物的每一行数据都加锁。所以显而易见会导致大量的超时和锁争用的问题。在我们的实际项目开发中很少使用这个级别。

  四种隔离级别的等级:read uncommitted < read committed < repeatable read < serializable

隔离级别 是否出现脏读 不可重复读 是否出现幻读 是否枷锁读
read uncommitted
read committed
repeatable read
serializable

在不同的数据库和不同的存储引擎中其实现的隔离级别不同,大家可以根据不同的存储引擎针对性的查阅。

MySQL中设置隔离级别

set [global/session] transaction_isolation = "隔离级别"

global代表全局设置,使用global设置时当前会话不生效需要重开会话才有效。

session代表只在当前会话中设置。

你可能感兴趣的:(mysql,mysql,数据库)