概述
隔离级别是基于客户端来讨论的,不同的客户端在和服务器交互时可以有不同的隔离级别,
客户端处在什么隔离级别就具有什么隔离级别的问题。
mysql数据库的隔离级别一共有四种
1.read uncommitted
读未提交 不做任何隔离。可能产生脏读 不可重复读 虚读/幻读问题,性能最好。
2.read committed
读已提交 一个事务可以读取到另一个事务已经提交的数据。可以防止脏读,但可能存在不可重复读 虚读/幻读 问题。性能较好。
3.repeatable read
可重复读取 在查询整表数据时,一个事务可以读取到另一个事务已经提交的数据。可以防止脏读 不可重复读问题,但可能存在虚读/幻读问题。mysql默认采用此隔离级别。性能一般。
4.serializable
序列化 通过锁进行严格隔离,对同一个数据的访问要串行化进行。可以防止脏读 不可重复读 虚读/幻读 问题。但数据库处于串行化状态,效率极其低下。性能最差。
选择隔离级别的原则
选择不同的隔离级别,就可以防止在并发读写的过程中的不同的隔离性问题,隔离级别设置的越严格,防止的问题就越多但性能就越低,隔离级别设置的越宽松,性能就越好但可能产生的隔离性问题就越多。
数据库使用者应该根据自己的需求选择一个合理的隔离级别 – 选择一个能够防止想要防止的问题的情况下性能尽量好的隔离级别。
在真正的开发中 脏读问题太严重,所以read uncommitted很少用。serializable性能太差,也很少用。
所以只需根据是否需要防止不可重复读,在read committed 和 repeatable read之间选择一个即可。
在实际开发中 repeatable read用的多一些。
查询当前客户端隔离级别的命令
select @@tx_isolation;
修改隔离的命令
set [session/global] transaction isolation level 隔离级别名称;
可以通过选择[session]来指定修改的是当前客户端的隔离级别,mysql服务器默认的隔离级别不变
可以通过选择[global]来指定修改的是mysql服务器默认的隔离级别,当前客户端隔离级别不变,默认不写是[global]