【问题标题】:tsql wait for change with Read Committed Snapshot Ontsql 等待更改,读取已提交快照打开
【发布时间】:2019-01-29 15:51:05
【问题描述】:

您好 Stackoverflow 社区,

让我请求您的帮助,因为我确实遇到了一个关键问题。

我们有两个链接的服务器,它们都是 Microsoft SQL Server:CRM 和 DW 服务器。 CRM系统的一些变化会触发一个程序来立即获取DW服务器的更新,其工作方式是CRM系统调用DW服务器来更新记录。在我的例子中,来自 CRM 系统 的 CRM 和 DW sql 服务器的更新被称为同时,问题就从这里开始了。

DW 服务器尝试在事务开始之前读取更改并获取记录。是的,这是因为 CRM 服务器使用:

读取提交的快照打开

很遗憾,我们无法更改 CRM sql 服务器上的隔离级别。简单的解释 - CRM 来自第三方提供商,他们想限制我们做出这些可能性。

有没有其他方法,等待事务提交,提交后读取最新数据?

如果缺少信息,请告诉我,然后我会提供更多见解。

【问题讨论】:

  • 您标记了两个不同版本的 SQL Server,不确定这是否适用于两个 CRM 和 DW 服务器,但我添加了 sql-server 标记。

标签: sql-server tsql isolation-level read-committed-snapshot


【解决方案1】:

我不了解这里的控制流程,但是从第一段中您说 CRM 中的更新会触发 proc 来更新 DW 服务器。所以,我看不到 DW 服务器如何在 CRM 服务器之前更新。你说它们是同时被调用的,但这会否定关于触发器的评论。您不希望 DW 获得脏读,因此 READ COMMITTED SNAPSHOT 是一个不错的选择,但您也可以在事务级别指定所需的任何隔离级别并覆盖服务器默认值。

既然你问“有没有办法等待事务提交,然后在提交后读取最新数据?”。当然,这可以通过几种方式处理......

  • 一个是AFTER INSERT 触发器
  • 另一种方法是将UPDATE 添加到DW 中INSERT 语句之后的代码块中,在相同的过程中。在这里,您可以使用TRY / CATCH,当然还有SET XACT_ABORT ON,这样如果出现任何故障,整个事务都会回滚。记住,nested transaction aren't real.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-14
    • 2020-01-08
    • 2014-01-03
    • 1970-01-01
    • 1970-01-01
    • 2013-08-16
    • 2019-01-18
    • 1970-01-01
    相关资源
    最近更新 更多