mysql事务隔离级别?
SQL标准定义的四个隔离级别为:
- READ UNCOMMITTED (导致脏读)
- READ COMMITTED (导致幻读)
- REPEATABLE READ (默认使用, 避免幻读, 也能避免脏读)
- SERIALIZABLE (更高级别隔离, 避免幻读, 避免脏读)
InnoDB存储引擎默认支持的隔离级别是REPEATABLE READ, 但是与标准SQL不同的是, InnoDB存储引擎在REPEATABLE READ事 务隔离级别下, 使用Next-Key Lock锁的算法, 因此避免幻读的产生 。 这与其他数据库系统 (如Microsoft SQL Server数据库) 是 不同的 。所以说, InnoDB存储引擎在默认的REPEATABLE READ的事务隔离级别下已经能完全保证事务的隔离性要求, 即达到 SQL标准的SERIALIZABLE隔离级别。
隔离级别越低, 事务请求的锁越少或保持锁的时间就越短 。 这也是为什么大多数数据库系统默认的事务隔离级别是READ COMMITTED。
在InnoDB存储引擎中, 可以使用以下命令来设置当前会话或全局的事务隔离级别:
SET[GLOBAL|SESSION]TRANSACTION ISOLATION LEVEL
{
READ UNCOMMITTED
|READ COMMITTED
|REPEATABLE READ
|SERIALIZABLE
}
在SERIALIABLE的事务隔离级别, InnoDB存储引擎会对每个SELECT语句后自动加上LOCK IN SHARE MODE, 即为每个读取操
作加一个共享锁 。 因此在这个事务隔离级别下, 读占用了锁, 对一致性的非锁定读不再予以支持 。
|