小编Joe*_*ool的帖子

SQL Server UPDATE 的隔离性和原子性

下面两条SQL语句在原子性和隔离性上有什么区别吗?

批次A:

UPDATE Orders
SET InProgress = 1
WHERE Completed = 0
Run Code Online (Sandbox Code Playgroud)

批次 B:

UPDATE Orders
SET InProgress = 1
WHERE OrderID in (SELECT OrderID FROM Orders WHERE Completed = 0)
Run Code Online (Sandbox Code Playgroud)

在 READ COMMITTED 的 SQL Server 中默认隔离级别下,我相信您可能会遇到批处理 B 的并发问题。在子查询选择之后,另一个进程可以在某些选定行上将 Completed 设置为 1,但批处理 B 不知道它仍然会在它们上设置 InProgress = 1。

但是A批次呢?在批处理 A 将 InProgress 设置为 1 之前,其他进程是否可以在任何行上更改 Completed?或者它是原子的并且与任何其他进程隔离?

另一种提问方式是,何时在 READ COMMITTED 隔离下的表上放置更新(或排他)锁?在批处理 A 中,我假设它发生在 WHERE 子句被评估之前,使批处理原子化和隔离。B批次呢?在评估子查询之前或之后,更新/排他锁是放在 Orders 上的吗?

sql-server concurrency

7
推荐指数
1
解决办法
2437
查看次数

需要分号来结束语句的 T-SQL 工具

我有什么可能是一个相当不寻常的问题。是否有一个T-SQL工具需要用分号来终止语句?我知道在SQL Server 2008 R1 中不需要使用分号,这是我要连接的,但实际上我想被迫使用它来运行更新查询。我相信我们都知道在 sql pad 中间编写如下查询的危险,然后突出显示它并运行它(不幸的是,这是我经常做的事情):

UPDATE dbo.Customers
SET ZipCode = '40223'
WHERE Name = 'Bob Loblaw'
Run Code Online (Sandbox Code Playgroud)

...因为您只需错选一次您的文本即可核对所有客户的邮政编码!

所以,理想情况下,我想继续在SQL Server Management Studio中完成我的大部分 sql 工作,但有一个单独的垫打开(在需要分号的工具中)并且只允许自己在那里编写数据操作查询。这会让我非常安心,因为我知道我永远不会错过选择我常用的更新查询。如果我这样做了,它就不会运行,因为它没有分号。

sql-server-2008

3
推荐指数
1
解决办法
1146
查看次数

标签 统计

concurrency ×1

sql-server ×1

sql-server-2008 ×1