7.事务隔离级别之Serializable

最后我们学习一下最高的事务隔离级别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时,其执行事务时会阻塞其他并发事务,从上面的错误信息中我们也可以看出应该是通过某种锁来实现的。既然是这样,那么“脏读”、“不可重复读”和“幻读”自然是不可能发生了。



  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值