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

时间:2018-10-22 07:21:08

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

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

我们的办公室中使用该应用程序的员工超过150名。其中大多数是数据输入运算符。因此,尽管数据存储假定任何人都试图生成报告,但应用程序停止工作并发生死锁。创建了用于存储信息的不同线程和用于检索相同信息(或生成报告)的不同线程。

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

如何同时做两件事,即存储和检索数据? 有什么办法可以避免死锁吗?

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

更新

在这种情况下,使用视图是否有用?

谢谢!

4 个答案:

答案 0 :(得分:2)

    我将不得不使用不同的数据库,一个用于接收数据和处理,另一个用于保存报告数据。 -允许脏读的业务规则,然后创建一个快照,其中数据从插入的数据同步到报告数据库。
    • 业务规则不会读取任何内容,然后在插入数据并立即将其插入报表数据库时进行同步。
  1. 填充的表不应是用于报告的表。
  2. 您可以进行交易,但这将使报告花费更长的等待时间。

答案 1 :(得分:1)

我会在您的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

答案 2 :(得分:1)

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

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
    BEGIN TRANSACTION;

答案 3 :(得分:1)

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

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