mar*_*c_s 18 sql-server transaction-isolation isolation-level
使用SQL Server的事务隔离级别,您可以避免某些不需要的并发问题,例如脏读等.
我现在感兴趣的是丢失更新 - 事实上两个事务可以覆盖彼此的更新,而没有人注意到它.我看到并听到相互矛盾的陈述,至少我必须选择哪种隔离级别来避免这种情况.
Kalen Delaney在她的"SQL Server Internals"一书中说(第10章 - 事务和并发 - 第592页):
在Read Uncommitted隔离中,除了丢失更新之外,前面描述的所有行为都是可能的.
另一方面,一个独立的SQL Server培训师给我们一个课程告诉我们,我们至少需要"可重复读取"以避免丢失更新.
那么谁是对的?为什么?
Fra*_*ers 12
我不知道回答为时已晚,但我只是在大学学习交易隔离级别,作为我研究的一部分,我遇到了这个链接:
具体而言,该段落是:
丢失更新
可以通过两种方式之一来解释丢失的更新.在第一种情况下,在第一个事务提交或回滚之前,当一个事务更新的数据被另一个事务覆盖时,认为丢失的更新已经发生. SQL Server 2005中不会发生此类丢失更新,因为在任何事务隔离级别下都不允许这样做.
丢失更新的另一种解释是当一个事务(事务#1)将数据读入其本地内存,然后另一个事务(事务#2)更改此数据并提交其更改.在此之后,Transaction#1根据在执行Transaction#2之前读入内存的内容更新相同的数据.在这种情况下,可以将Transaction#2执行的更新视为丢失更新.
所以从本质上讲,两个人都是对的.
就个人而言(我对错误是开放的,所以请纠正我,因为我正在学习这个)我从这里得到以下两点:
事务环境的重点是防止丢失更新,如上一段所述.因此,即使最基本的交易级别不能这样做,那么为什么还要费心去使用它.
当人们谈论丢失的更新时,他们知道第一段适用,因此一般来说意味着第二种类型的丢失更新.
如果有任何错误,请再次纠正我,因为我也想了解这一点.
书中的例子是文员A和文员B接收小部件的装运.
他们都检查当前的库存,看看有库存.职员A有50个小部件,更新到75个,职员B有20个小工具,所以45个更新覆盖了之前的更新.
我认为她的意思是,在职员A做的所有隔离级别都可以避免这种现象
UPDATE Widgets
SET StockLevel = StockLevel + 50
WHERE ...
Run Code Online (Sandbox Code Playgroud)
和职员B做
UPDATE Widgets
SET StockLevel = StockLevel + 20
WHERE ...
Run Code Online (Sandbox Code Playgroud)
当然,如果SELECT并且UPDATE作为单独的操作完成,则需要repeatable read避免这种情况,以便S在事务持续期间保持对行的锁定(这将导致此方案中的死锁)
| 归档时间: |
|
| 查看次数: |
6556 次 |
| 最近记录: |