7.事务隔离级别之Serializable

本文详细介绍了数据库事务隔离级别的最高级别Serializable,通过示例演示了它如何通过串行执行事务来避免脏读、不可重复读及幻读等问题,并讨论了其对数据库性能的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最后我们学习一下最高的事务隔离级别Serializable,顾名思义,可串行化的,也即并发事务串行执行。很显然,该级别可以避免前面讲到的所有问题:“脏读”、“不可重复读”和“幻读”。代价是处理事务的吞吐量低,严重浪费数据库的性能,因此要慎用此事务隔离级别。


下面演示Serializable如何解决这些问题:

1. 小明连接数据库去查询自己本学期的成绩,他设置session(当前连接)的事务隔离级别为Serializable:

xiaoming> set session transaction isolation level serializable;
Query OK, 0 rows affected (0.00 sec)

xiaoming> select @@tx_isolation;
+----------------+
| @@tx_isolation |
+----------------+
| SERIALIZABLE   |
+----------------+
1 row in set (0.00 sec)

2. 小明开始查询成绩,由于还没有录入,因此没有成绩:

xiaoming> begin;
Query OK, 0 rows affected (0.00 sec)

xiaoming select * from scores where name = 'xiaoming';
Empty set (0.00 sec)

3. 这时小明的班主任王老师也连接数据库来录入成绩,可是他会卡在插入第一条成绩信息这里, 如下所示,insert语句迟迟不会返回:

mr.wang> begin;
Query OK, 0 rows affected (0.00 sec)

mr.wang> insert into scores(name, score) values ('xiaoming', 69);

4. 小明结束本次查询:

xiaoming> commit;
Query OK, 0 rows affected (0.00 sec)

5. 这时王老师插入第一条成绩才完成:

mr.wang> insert into scores(name, score) values ('xiaoming', 69);
Query OK, 1 row affected (3.42 sec)

6. 如果小明久久不结束查询,还会导致王老师录入成绩超时:

xiaoming> insert into scores(name, score) values ('xiaoming', 69);
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction


从上面的例子我们可以看出,如果一个session设置隔离级别为Serializable时,其执行事务时会阻塞其他并发事务,从上面的错误信息中我们也可以看出应该是通过某种锁来实现的。既然是这样,那么“脏读”、“不可重复读”和“幻读”自然是不可能发生了。



评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值