我正在使用带有AdventureWorksLT2008数据库的SQL Server Express 2008来理解Read committed& amp;阅读未提交。
根据维基百科: http://en.wikipedia.org/wiki/Isolation_%28database_systems%29
READ COMMITTED
查询检索的数据记录是 没有阻止修改 其他一些交易。
假设有一个名为 SalesLT.Address 的表和一个列 AddressLine2 ,其中所有行都有空白值
然后我运行此查询:
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
BEGIN TRANSACTION
update SalesLT.Address set AddressLine2 = 'new value'
BEGIN TRANSACTION
select AddressLine2 from SalesLT.Address
--Break Here
/*
COMMIT TRANSACTION
COMMIT TRANSACTION
*/
因此,您可以看到第一个事务尚未提交,第二个事务开始查询数据。
结果:
那么,为什么第二个交易可以检索幻像数据,即使第一个交易仍未提交?
答案 0 :(得分:6)
当在交易中读取数据时,该交易所做的任何更改都是可见的 - 仅在该交易中(尽管READ UNCOMMITTED对此进行了更改)。所以,即使您已经启动了第二个嵌套的事务,您仍然处于第一个事务的范围内,因此可以读取已更改的数据并获取“更改的值”。
例如,在单独的SPID上的另一个事务将阻止它是否使用READ COMMITTED并尝试读取此数据。