我们的应用程序遇到了问题。我们有两个监控应用程序实例。应用行为如下:
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/