事务的隔离性(Isolation)

4种隔离级别

  1. Read Uncommited 读未提交
    这种事务隔离级别下,select语句不加锁。(会读到update未commit的数据)
    此时,可能读取到不一致的数据,即“读脏 ”。这是并发最高,一致性最差的隔离级别。

  2. Read committed 读已提交
    可避免 脏读 的发生:
    新建事务1-查询
    新建事务2-更新
    回到事务1-查询-结果不变
    事务2-提交
    事务1-查询-结果变了

  3. Repeatable Reads 可重复读
    MySql默认隔离级别。
    可避免 脏读 、不可重复读 的发生:
    新建事务1-查询
    新建事务2-更新
    回到事务1-查询-结果不变
    事务2-提交
    事务1-查询-结果还是不变
    事务1-提交
    新建事务3-查询-结果变了

  4. Serializable 串行化
    可避免 脏读、不可重复读、幻读 的发生。

-- 查询当前隔离级别
SELECT @@tx_isolation;
-- 设置隔离级别
SET session TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
-- 取消自动commit
set autocommit = 0;

以上四种隔离级别最高的是 Serializable 级别,最低的是 Read uncommitted 级别,当然级别越高,执行效率就越低。像 Serializable 这样的级别,就是以 锁表 的方式(类似于Java多线程中的锁)使得其他的线程只能在锁外等待,所以平时选用何种隔离级别应该根据实际情况。在MySQL数据库中默认的隔离级别为Repeatable read (可重复读) 。