c++ - SQL_TXN_SERIALIZABLE 优于 DB2 和 C++ 中的 SQL_TXN_REPEATABLE_READ

标签 c++ db2

我们的应用程序遇到了问题。我们有两个监控应用程序实例。应用行为如下:

Step 1. Monitor the ftp folder in a loop
Step 2. If files are present, insert the file details to DB for the all files
Step 3. Read the file details from the DB and process it
Step 4. Once the file is selected from DB change the status to start processing so that no other process should process it.

这里我们有两个监控进程,同一个程序的两个实例(monitor --instance 1 && monitor --instance 2)

这里在某个特定时间,进程 monitor1 和 monitor2 从数据库和进程读取相同的数据。因此,同一个文件被处理了两次。

这是由于第3步和第4步的延迟。monitor1做了step 3,在做step 4之前,monitor2也做了step3,所以它不知道monitor1已经拿到了记录。

我们的数据库是 db2,我们在步骤 3 中使用 SQL_TXN_READ_UNCOMMITTED 隔离级别。我从 IBM 站点发现 SQL_TXN_REPEATABLE_READ 或 SQL_TXN_SERIALIZABLE 是解决此问题的方法,因为这可以防止脏读。

这是在我们的情况下使用的最佳选择。我从网上读到 SQL_TXN_SERIALIZABLE 会减慢数据库访问速度。

如果有人实时遇到过这个问题,您能否分享解决方案。

非常感谢任何想法/建议。

谢谢, 马修·李菊

最佳答案

您可能想要使用 SQL_TXN_READ_COMMITTED,而不是 SQL_TXN_REPEATABLE_READ 或 SQL_TXN_SERIALIZABLE,因为它提供比其他两种方法更好的并发性。

请参阅 isolation levels 上的 DB2 文档,请记住以下映射:

   CLI Name                    DB2 Isolation Level
   ------------------------    -------------------
   SQL_TXN_READ_UNCOMMITTED    Uncommitted Read
   SQL_TXN_READ_COMMITTED      Cursor Stability
   SQL_TXN_REPEATABLE_READ     Read Stability
   SQL_TXN_SERIALIZABLE        Repeatable Read

因为这听起来像是在其中一个工作人员开始处理文件时设置了一个标志,请与您的 DBA 联系以查明是否已启用 DB2_EVALUNCOMMITTED 注册表变量,因为这也可能有助于防止两个线程互相等待。

关于c++ - SQL_TXN_SERIALIZABLE 优于 DB2 和 C++ 中的 SQL_TXN_REPEATABLE_READ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2325002/

相关文章:

c++ - 比较指向的两个整数值

c++ - 用于在链表中查找连接点的生产代码

c++ - GTK最大化Form c++

C++ 多态和切片

sql - 为什么 DB2 不允许我在 WHERE 子句中有一个列?

sql - DB2:合并 3 列输出的函数

db2 - 从 .Net Core 调用 AS400 DB

c++ - 在 C++ 中,如何初始化在 Singleton 模板中声明的私有(private)类的静态成员?

stored-procedures - 如何在IBM System i Access Windows版GUI工具中调用存储过程

mysql - 帮助我为独立应用程序选择 RDBMS。很少关注