2011-04-08 29 views

回答

10

我发现,大多数数据库API的只在螺纹连接级别的安全。火鸟可能会有所不同,但使用InterBase几年(8+)以前,它不是线程安全的。更新:I have verified Firebird is only thread safe at the connection level.

这意味着您通常需要避免同时使用来自多个线程的单个连接。针对给定连接执行查询。 避免在针对相同连接运行的不同线程中有两个查询。

但是,如果你有两个连接,你可以同时运行两个查询。

您的问题的本质似乎是如何以安全的方式将数据传递给线程,尽管您的具体需求是数据库,但无论线程中包含的内容如何,​​这都适用于通用方式。

传递数据的最简单方法是在创建时,您可以创建挂起的线程,在TThread后代中设置各种属性。然后恢复线程的执行。 您需要从Execute()方法调用执行线程中工作的实际代码。

如果您需要在线程之间共享数据,则必须将其包含在允许同步的各种结构之一中,例如Critical Section,Mutex或Semaphore。

Delphi在SyncObjs.pas单元中为它们中的每一个都有库包装器。

+0

+1对于我的其中一个项目,我广泛使用它(后台线程中的查询)。但是我不需要将实际的查询对象从一个线程传递到下一个线程,而我正在为每个线程使用一对DbConnection +事务。 – 2011-04-08 11:51:09