事务的隔离级别(Transaction isolation levels)5

本文详细介绍了数据库中SERIALIZABLE隔离级别的工作原理及其特点。通过一个具体的示例,展示了在一个事务内执行相同查询时如何避免幻影读现象,同时讨论了SERIALIZABLE隔离级别带来的性能影响。

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

SERIALIZABLE隔离级别可以确保,如果一个查询语句多次执行,不会有数据改变。换句话说,在一个事务里执行相同的查询语句两次,查询出来的数据是一样的,我们将不会看到phantoms。

举个例子

 -- Open two new connections 
 -- Step 1: 
 -- In the first connection, start a transaction 
 USEIsolationDB ;
 SET TRANSACTION ISOLATION LEVEL SERIALIZABLE ;
 BEGIN TRAN
 SELECT *
 FROM IsolationTest
 WHERE col1 BETWEEN 20 AND 40 ;
 --<EXECUTE>

第一步,先查询一下,事务是开着的状态,即使查询语句已经结束了。

 -- Step 2:
 -- In the second connection, insert new data
 USE IsolationDB
 INSERT INTO IsolationTest
 VALUES (35, 'Another New Row' ) ;
 -- Notice that the INSERT will block
 --<EXECUTE>

第二步,插入一条新记录,发现这个insert是一直处于堵塞状态,执行不了。

 -- Step 3:
 -- Go back to the first connection and rerun the SELECT 
 SELECT *
 FROM IsolationTest
 WHERE col1 BETWEEN 20 AND 40 ;
 --<EXECUTE>
 -- Notice no new rows

第三步,再次执行那个查询语句,返回的结果是一样的。

为了阻止phantoms,是需要代价的。除了要锁住所有的正在被读取的数据外,还要执行SERIALIZABLE隔离级别。

转载于:https://my.oschina.net/cfanyjr/blog/184367

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值