一、数据库的隔离级别分类
根据实际需求,通过设置数据库的事务隔离级别可以解决多个事务并发情况下出现的脏读、不可重复读和幻读问题。数据库事务隔离级别由低到高依次为Read uncommitted、Read committed、Repeatable read和Serializable四种。数据库不同,其支持的事务隔离级别亦不相同:MySQL数据库支持上面四种事务隔离级别,默认为Repeatable read;Oracle 数据库支持Read committed和Serializable两种事务隔离级别,默认为Read committed。
1、Read uncommitted(读未提交)
可能出现脏读、不可重复读和幻读。
2、Read committed(读已提交)
可以避免脏读,但可能出现不可重复读和幻读。大多数数据库默认级别就是Read committed,比如Sql Server数据库和Oracle数据库。注意:该隔离级别在写数据时只会锁住相应的行。
3、Repeatable read(可重复读)
可以避免脏读和不可重复读,但可能出现幻读。注意:事务隔离级别为可重复读时,如果检索条件有索引(包括主键索引)的时候,默认加锁方式是next-key锁;如果检索条件没有索引,更新数据时会锁住整张表。一个间隙被事务加了锁,其他事务是不能在这个间隙插入记录的,这样可以防止幻读。
4、Serializable(序列化)
可以避免脏读、不可重复读和幻读,但是并发性极低,一般很少使用。注意:该隔离级别在读写数据时会锁住整张表。
二、总结
事务隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
Read uncommitted(读未提交) | √ | √ | √ |
Read committed(读已提交) | × | √ | √ |
Repeatable read(可重复读) | × | × | √ |
Serializable(序列化) | × | × | × |
说明:√表示可能出现,×表示不会出现。
注意:隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大。
三、MySQL事务隔离级别
1、查看
MySQL数据库支持Read uncommitted、Read committed、Repeatable read和Serializable四种事务隔离级别,默认为Repeatable read,可以通过如下语句查看MySQL数据库事务隔离级别:select @@global.tx_isolation,@@tx_isolation;
如下图所示:
2、修改
MySQL数据库事务隔离级别的修改分为全局修改和当前session修改,具体修改方法如下:
- 全局修改
1.1 在my.ini配置文件最后加上如下配置:
#可选参数有:READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE.
[mysqld]
transaction-isolation = READ-UNCOMMITTED
1.2 重启MySQL服务 - 当前session修改,登录MySQL数据库后执行如下命令:set session transaction isolation level read uncommitted;