MySQL: Mysql 事务隔离级别
数据并发访问(了解)
一个数据库可能拥有多个访问客户端,这些客户端都可以并发方式访问数据库.
数据库的相同数据可能被 多个事务同时访问,如果不采取隔离措施,就会导致各种问题, 破坏数据的完整性
并发访问会产生的问题
事务在操作时的理想状态: 所有的事务之间保持隔离,互不影响。
因为并发操作,多个用户同时访问同一个数据,可能引发并发访问的问题
并发访问的问题 | 说明 |
脏读 | 一个事务读取到了另一个事务中尚未提交的数据 |
不可重复读 | 一个事务中两次读取的数据内容不一致, 要求的是在一个事务中多次读取时数据是一 致的. 这是进行 update 操作时引发的问题 |
幻读 |
一个事务中,某一次的 select 操作得到的结果所表征的数据状态, 无法支撑后续的业务 操作. 查询得到的数据状态不准确,导致幻读. |
四种隔离级别
通过设置不同的隔离级别,可以防止对应的并发问题.
MySQL数据库有四种隔离级别,上面的级别最低,下面的级别最高。
✔ 会出现问题
✘ 不会出现问题
级 别 | 名字 | 隔离级别 | 脏 读 | 不可重复 读 | 幻 读 | 数据库的默认隔离级别 |
1 | 读未提交 | read uncommitted | ✔ | ✔ | ✔ | |
2 | 读已提交 | read committed | ✘ | ✔ | ✔ | Oracle和SQLServer |
3 | 可重复读 | repeatable read | ✘ | ✘ | ✔ | MySql |
4 | 串行化 | serializable | ✘ | ✘ | ✘ |
注意:
<1>隔离级别 从小到大,安全性是越来越高的,但是效率是越来越低的
<2>应根据不同的情况,选择对应的隔离级别
隔离级别相关命令
1) 查看隔离级别
select @@tx_isolation;
2) 设置事务隔离级别,需要退出 MySQL 再重新登录才能看到隔离级别的变化
set global transaction isolation level 级别名称; read uncommitted 读未提交 read committed 读已提交 repeatable read 可重复读 serializable 串行化
例如: 修改隔离级别为 读未提交
set global transaction isolation level read uncommitted;