【问题标题】:Scope of locks when using TRANSACTION ISOLATION LEVEL SERIALIZABLE使用 TRANSACTION ISOLATION LEVEL SERIALIZABLE 时的锁范围
【发布时间】:2023-03-26 11:57:01
【问题描述】:

以下链接描述了可序列化的事务隔离级别。

http://blogs.msdn.com/b/sqlcat/archive/2011/02/20/concurrency-series-basics-of-transaction-isolation-levels.aspx

假设我有一个用户更新表[dbo].[Table_A]。另一个用户正在更新表[dbo].[Table_B]。而且我想序列化这两个更新语句(意味着在第二个开始之前等待第一个完成),尽管我们正在接触不同的表。我猜我不能使用表锁,但也许范围锁可以做到这一点。有人可以帮我理解代码的样子吗?或者这不适用于 SQL Server 2008 中的事务隔离级别功能?

【问题讨论】:

  • 为什么要将更新序列化到不同的表?你想解决什么问题?
  • 我正在处理一个有向无环图(多层次)数据模型。一个表与另一个表连接并强制继承。
  • 所以您正在使用来自table_a 的数据更新table_b?您能否发布您的更新声明?
  • 为了论证,我们假设它们没有加入。因为我有没有连接的例子。更新 [dbo].[Table_A] 设置 x=1 并更新 [dbo].[Table_B] 设置 y=1
  • 我不明白您为什么不能并行执行此操作

标签: sql-server-2008 tsql serialization locking transaction-isolation


【解决方案1】:

您可以放置​​应用程序锁:

EXEC  sp_getapplock @resource = 'my_resource_token', @lockMode = 'Exclusive'

UPDATE ...

EXEC  sp_releaseapplock @resource = 'my_resource_token'

如果另一个会话获得了my_resource_token,这将锁定。

【讨论】:

  • 我稍后会发布详细信息,以使应用程序性能更好。现在,这是完美的。谢谢!所以我的理解是,在数据库上运行的任何命令都是序列化的?
  • @MacGyver:是的,getapplockreleaseapplock 之间的所有内容一次只能由一个事务执行。
  • 使用这种方法找到锁的最佳方法是什么?使用“sp_lock”?
  • @MacGyver: sys.dm_tran_locks
猜你喜欢
  • 2015-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多