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

READ COMMITTED

READ COMMITTED这是数据库默认的隔离级别。它能保证你不能读取那张表格数据,只要有其它事务还在改变这张表格数据。可是,因为sql server在select操作的时,锁表格时间就那么一小会儿,如果一个事务在READ COMMITTED级别下重复读数据,这样那个数据可能还是会变,或者新的行可能出现并且还是满足了原来的查询条件,能查询到。你以为还是原来的那些数据,其实又有新的内容在里面了。


READ COMMITTED有两个地方要注意。第一,它能阻止 dirty reads,但是第二,它还是允许non-repeatable reads和phantom reads.

第一点阻止 dirty reads,举个例子,


-- Step 1:
-- Start a transaction but don't commit it
USE IsolationDB ;
GO
BEGIN TRAN
UPDATE IsolationTest
SET col2 = 'New Value' ;
--<EXECUTE>
更新了数据,但未结束事务,事务还在影响这张表格。



-- Step 2: 
-- Start a new connection and change your isolation level 
USE IsolationDB ;
GO
SET TRANSACTION ISOLATION LEVEL READ COMMITTED ;
SELECT *
FROM IsolationTest ;
--<EXECUTE>
-- You should notice that the process blocks, and returns
-- no data or messages!

在READ COMMITTED级别下读取。你注意到过程是堵塞的,不能返回数据,因为有一个修改事务影响着。


-- To finish up, perform the following two steps:
-- Step 3:
-- Return to the connection from Step 1 and issue a ROLLBACK
ROLLBACK TRANSACTION ;
--<EXECUTE>
回滚事物喽。



-- Step 4: 
-- Rerun the SELECT statement in the connection from Step 2 
SELECT *
FROM IsolationTest ;
-- <EXECUTE>
-- Verify that the data is available
可以显示数据了。只不过是原来的数据。


这个就不像READ UNCOMMITTED还能读取。

看一下READ COMMITTED第二点,non-repeatable reads,举个例子。

先关闭全部的查询窗口。打开两个新的查询窗口。


-- Step 1:
-- Read data in the default isolation level
USE IsolationDB
SET TRANSACTION ISOLATION LEVEL READ COMMITTED ;
BEGIN TRAN
SELECT AVG(col1)
FROM IsolationTest ;
--<EXECUTE>
第一步,设置了默认的隔离级别,开始一个事务来读取平均值,



-- Step 2:
-- In a new connection, update the table:
USE IsolationDB ;
UPDATE IsolationTest
SET col1 =500
WHERE col1 =50 ;
--<EXECUTE>
第二步,更新了表格。假设第一步已经结束了,那么第二步的将会更新成功,即使第一步的连接还是在事务里。这个UPDATE是一个自动提交的事务,所以SQL server会锁住它,一旦提交完成又自动释放它。



-- Step 3:
-- Go back to the first connection and 
-- run the same SELECT statement:
SELECT AVG(col1)
FROM IsolationTest ;
--<EXECUTE>
第三步,再次执行查询语句,平均值就变了,这就是一个non-repeatable read。默认的READ COMMITTED隔离级别能阻止正在读取的数据被改变,但是仅仅指的是正在被读取的数据被改变。一旦这个读取操作结束了,那么其它的事务就能改变数据,即使读取操作所在的那个事务还打开着,没有提交结束。结果就是,也不能保证我们能取得一样的数据。









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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值