四种隔离级别
- READ UNCOMMITTED(读取未提交的数据)
这个事务隔离级别中所有事务都可以看到未提交的执行结果。这可能会产生很多问题,因为事务未提交表明结果是不确定的,万一回滚了,读取的结果就是错误的,一般都不会使用这个隔离级别,也称为“脏读”。 - READ COMMITTED(读取提交数据)
大多数数据库默认的隔离级别(但不是MySQL默认的隔离级别),事务间是不可见的,一个事务只能读取到已提交事务的执行结果,也称为“不可重复读”,即同一个事务内执行相同的读语句,读取的结果可能不一致(会读取到其他事务提交的更新后的结果)。 - REPEATABLE READ(可重读)
MySQL默认的隔离级别,同一个事务中执行相同的读语句,结果都是一致的,InnoDB默认级别。这也会有个问题,如果在这个事务中,其他事务修改了结果,可能发生“幻读”。InnoDB通过多版本并发控制机制解决了幻读问题 - SERIALIZABLE(串行化)
最高的隔离级别,它强制事务排序,并行处理,解决了幻读问题,也就是在每个读数据行上加锁,这不仅会使性能大打折扣(只能读,写要等待),还会出现连锁反应(一个事务超时,后面的事务可能都会超时)
修改事务隔离等级
- 全局修改,修改mysql.ini配置文件,在最后加上
#可选参数有:READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE
transaction-isolation = REPEATABLE-READ
- 当前session修改,在登录mysql客户端后,执行命令
-- 设置隔离级别READ UNCOMMITTED
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
-- 查询隔离级别
SELECT @@TX_ISOLATION;
mysql有一个autocommit参数,默认是on,它的作用是每一条查询都是一个事务,并且自动开始,自动提交(执行完就自动结束),通常我们通过Spring进行事务管理,Spring可以将一个方法内所有语句作为一个事务,代码层面还会引出事务传播的问题。