两个单独的 exe(进程)使用相同的数据库和更新数据库,如果用户在 Delphi xe2 中同时运行两个 exe 进行数据库更新,如何同步数据库操作。如果我们运行一个 exe,它看起来就像挂起,直到在数据库中进行更新。我正在使用 ODBC 连接。请建议。
我在两个exe(进程)中都使用控件连接到数据库。我使用的数据库是 Sybase SQL Anywhere 12。
两个单独的 exe(进程)使用相同的数据库和更新数据库,如果用户在 Delphi xe2 中同时运行两个 exe 进行数据库更新,如何同步数据库操作。如果我们运行一个 exe,它看起来就像挂起,直到在数据库中进行更新。我正在使用 ODBC 连接。请建议。
我在两个exe(进程)中都使用控件连接到数据库。我使用的数据库是 Sybase SQL Anywhere 12。
对于我可以用谷歌搜索的内容,有两个版本的 Anywhere aka WatcomSQL:服务器和 UltraLite
第一个问题当然是你是否使用事务:http ://en.wikipedia.org/wiki/Database_transaction
虽然大多数 RDBMS 需要显式使用事务,但一些简化的类 RDBMS(如 MySQL 或 Advantage)则不需要。而且看起来SQL Anywhere 还可以让您在没有事务的情况下工作。这是一个陷阱:没有事务可能更容易开始,但它仅在您拥有单个独家客户端时才有效。 http://infocenter.sybase.com/help/topic/com.sybase.help.sqlanywhere.12.0.1/uladmin/fo-databases-s-5108100.html
如果你偷工减料并制作了无事务程序,那么可能是重构它的时候了。或者,也许 Sybase 中继服务器可以提供一些帮助。
您可能正在使用嵌入式数据库模式或某种本地连接。如果是这样,请尝试将 Server 作为单独的应用程序安装并通过 TCP/IP 网络连接到它,尽管它实际上是在同一台机器上运行的。
如果您使用事务,那么如果阻塞另一个事务,则可能是在大规模插入更新一个事务期间。例如,如果您使用数字 ID 字段,则有一个常见的数据库杀手陷阱来分配新的数据 ID,Select MAX(ID) + 1 from TableName
或者它可能是其他一些锁定。http://en.wikipedia.org/wiki/Snapshot_isolation
虽然 SQL Anywhere Server 12 被告知使用版本控制引擎,但它可能仅在某些事务上使用它并在其他事务模式中使用阻塞,但会受到锁定升级的影响?或者任何地方 UltraLite 都不使用它?
好吧,无论如何,SQL Anywhere 中的快照隔离是基于 first-writer-wins 的,这迫使 writers 阻止 writers。
总而言之——你有机会在数据库事务层、网络层甚至连接库中拥有锁。要监视和检测所有潜在的锁定问题,您需要全面了解给定数据库,以及可用的监视和测试工具以及如何使用它。它认为您会更容易在 Sybase 论坛和 Stack Oмerflow 的 Sybase 部分中找到帮助,而不是在 Delphi 中。我认为这个答案值得发布在https://dba.stackexchange.com/questions/tagged/sybase