可串行化(SERIALIZABLE):最高的隔离级别,完全服从ACID四个特性。在这个隔离级别下,所有的事务是依次逐个执行,严格保证事务之间完全不可能产生干扰。这就意味着,这个级别可以有效防止脏读、不可重复读以及幻读。
MySQL中的InnoDB存储引擎的默认使用的隔离级别是REPEATABLE-READ(可重读)。
SELECT @@tx_isolation;
通过上面的命令可以查询出当前MySQL使用的隔离级别。
这里需要注意,MySQL对隔离级别的实现与SQL标准不同的地方在于InnoDB存储引擎在REPEATABLE-READ(可重读)事务隔离级别下使用的是Next-Key Lock锁算法,因此可以避免幻读的产生,这与其他数据库系统(如 SQL Server)是不同的。这也意味着InnoDB存储引擎的默认隔离级别REPEATABLE-READ(可重读)已经可以完全保证事务的隔离性要求,即达到了SQL标准的SERIALIZABLE(可串行化)隔离级别。
我们知道,数据库的隔离级别通常是使用锁来实现的。隔离级别越低,事务请求的锁也就越少,造成的性能损失也就越低,数据库响应也就越快,所以大部分数据库系统的隔离级别都是READ-COMMITTED(读取已提交内容)。但是你要知道的是,MySQL的InnoDB存储引擎默认使用的REPEATABLE-READ(可重读)并不会有任何性能损失(真的吗),因为MySQL做了一些相应的优化。另外,InnoDB存储引擎在分布式事务的情况下一般会用到SERIALIZABLE(可串行化)隔离级别,这是场景的特殊性决定的。
事务相关命令
在MySQL命令行的默认配置中,事务都是自动提交的,即执行SQL语句后就会马上执行COMMIT操作。
我们可以通过下面的命令来设置隔离级别。
SET [SESSION|GLOBAL] TRANSACTION ISOLATION LEVEL [READ UNCOMMITTED|READ COMMITTED|REPEATABLE READ|SERIALIZABLE]
另外还有一些并发控制语句,也是开发中经常会使用到的。
START TARNSACTION | BEGIN -- 显式地开启一个事务
COMMIT -- 提交事务,使得对数据库做的所有修改成为永久性
ROLLBACK -- 回滚会结束用户的事务,并撤销正在进行的所有未提交的修改。