介绍下数据库隔离级别以及各隔离下的问题,以及mysql的默认隔离级别
隔离级别
- Serializable:串行化
- 强制事务排序,串行化读写,避免冲突
- Repeatable read:可重复读
- 同一事务的多个实例在并发读取事务时,会“看到同样的”数据行
- Read committed:读已提交
- 一个事务开始时,只能“看见”已经提交事务所做的改变
- 一个事务从开始到提交前,所做的任何数据改变都是不可见的,除非已经提交
- Read uncommitted:读未提交
- 所有事务都可以“看到”未提交事务的执行结果
各隔离级别下的问题
见以下表格:
| 隔离级别 问题 | 脏读 | 不可重复读 | 幻读 | 加锁读 |
|---|---|---|---|---|
| Serializable | no | no | no | yes |
| Repeatable read | no | no | yes | no |
| Read committed | no | yes | yes | no |
| Read uncommitted | yes | yes | yes | no |
- 脏读:一个事务处理过程里读取了另一个未提交的事务中的数据
- 不可重复读:在一个事务的两次查询中数据不一致
- 幻读:幻读是事务非独立执行时发生的一种现象,如事务T1批量对一个表中某一列列值为1的数据修改为2的变更,
但是在这时,事务T2对这张表插入了一条列值为1的数据,并完成提交
此时,如果事务T1查看刚刚完成操作的数据,发现还有一条列值为1的数据没有进行修改
默认隔离级别
Mysql默认隔离级别:Repeatable read
sql server默认隔离级别:Read committed
如何设置隔离级别
(1)方法一
- 使用vi打开mysql配置文件
sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf - 在文件的最末尾添加如下配置, 指定mysql数据库的隔离级别为READ-COMMITTED(transaction-isolation=READ-COMMITTED);可选参数有:READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE.
- 在终端中重启mysql服务
sudo service mysql restart
(2)方法二:
- 进入mysql终端
- 设置隔离级别,可选的参数READ UNCOMMITTED | REPEATABLE READ | SERIALIZABLE
SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED;