如何避免同时存储和检索数据时发生数据库死锁?

How to avoid database-deadlock occurring while storing & retrieving data same time?

我们开发了一个 windows 应用程序,该应用程序像常规应用程序一样工作;收集大量信息、对其进行处理并生成报告...为了存储数据,我们使用了 SQL 服务器。对于报告,我们使用 Crystal 报告。

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

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

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

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

更新

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

谢谢!!

  1. 我必须使用不同的数据库,一个用于接收数据和处理,另一个用于保存报告数据。 - 允许脏读的业务规则,然后创建一个快照,其中数据从插入的数据同步到报告数据库。
    • 业务规则没有脏读,然后在插入数据时同步并直接插入到报告数据库中。
  2. 填充的 table 不应是用于报告的
  3. 您可以进行交易,但这会使报告的等待时间更长。

我会在您的 sql 服务器中打开 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

您可以试试这个来避免数据库死锁。

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
    BEGIN TRANSACTION;

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

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