【问题标题】:How to avoid database-deadlock occurring while storing & retrieving data same time?如何避免同时存储和检索数据时发生数据库死锁?
【发布时间】:2019-03-26 05:20:39
【问题描述】:

我们开发了一个windows应用程序,该应用程序使用起来就像普通应用程序一样工作;收集大量信息,对其进行处理并生成报告……为了存储我们使用 SQL Server 的数据。对于报表,我们使用 Crystal Reports。

我们办公室有 150 多名员工在使用该应用程序。他们中的大多数是数据输入操作员。因此,当数据存储假设有人尝试生成报告时,应用程序停止工作并发生死锁。为存储信息创建了不同的线程,为检索相同的信息(或生成报告)创建了不同的线程。

所以问题是如何避免死锁的情况,因为存储数据和生成报告是一个连续的过程,不能要求先存储数据,然后对其进行处理,然后生成报告......

如何同时做这两件事,即存储和检索数据? 有什么办法不会发生死锁?

欢迎任何与此相关的建议或查询..

更新

在这种情况下,使用 Views 有用吗?

谢谢!!

【问题讨论】:

  • 真正的问题是, 收藏了这个问题
  • 如何使用DB事务来防止脏读/写和死锁?
  • 数据库死锁是一个潜在问题和修复的兔子洞。有很多关于可能的原因和可能的解决方案的信息。但是,我们无法为您提供可靠的建议或使用如此多的信息解决您的问题。因此这个问题太宽泛了
  • 第一个答案是良好的索引 :) 服务器根据它使用的索引知道要锁定多少数据。例如,如果您的报告基于某个日期的所有记录,那么如果您在该日期有索引,则服务器将能够准确锁定这些记录。如果您没有同时按日期写入相同的记录,则应避免出现问题。如果您无法创建明确区分记录读取和写入的索引,则有一些方法可以强制读取忽略任何锁定 - 如果您愿意报告可能刚刚更改的数据。
  • 你绝对 100% 在谈论死锁而不是正常的标准锁。死锁仅在引擎检测到两个(或更多)进程由于持有第二个进程需要访问的锁而永远无法完成时发生,反之亦然。有时它可以像检查 SQL 代码/存储过程的逻辑一样简单,并确定您是否真的需要对“其他”对象进行锁定。绝对不是说这是“如何解决所有死锁”,但它可能是一种选择。

标签: c# sql-server windows winforms database-deadlocks


【解决方案1】:

您可以尝试这样做以避免数据库死锁。

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
    BEGIN TRANSACTION;

【讨论】:

    【解决方案2】:

    我会在你的 sql server 中打开Read Committed Snapshot Isolation,这样作者就不会阻塞读者。但读者在提交之前无法读取写入的记录。
    也就是说,不阻塞读者,也不做脏读

    这是一篇很棒的文章
    https://www.brentozar.com/archive/2013/01/implementing-snapshot-or-read-committed-snapshot-isolation-in-sql-server-a-guide/#comment-2220427

    【讨论】:

      【解决方案3】:

      默认情况下,对于 ODBC 连接,Crystal Reports 使用驱动程序支持的最高数据库隔离级别,即已提交读。您可以添加一个注册表项来指示 Crystal 使用较低的隔离级别。

      这是一个提供完整说明的文档: 1216415 - How to change the isolation level for an ODBC connection in Crystal Reports?

      【讨论】:

        【解决方案4】:
        1. 我必须使用不同的数据库,一个用于接收数据和处理,另一个用于保存报告数据。 - 允许脏读的业务规则,然后创建一个快照,其中数据从插入的数据同步到报告数据库。
          • 业务规则无脏读,然后在插入数据时同步并立即插入到报告数据库中。
        2. 填充的表格不应是用于报告的表格。
        3. 您可以进行交易,但这会使报告的等待时间变长。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-01-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多