我要从数据库 O 中插入一些数据到数据库 A,然后将日志写入数据库 B。现在,我有一个这样的函数:
list=DataBaseO.getdata();
if(list.id not in DataBaseB)
{
insert data into DatabaseA;
insert log into DatabaseB;
}
我想怎么跑就怎么跑。但是当我把它放到多线程程序中时,它却出错了。日志太大,插入到DataBase B中花费了很多时间。当1号线程试图插入日志时,2号线程已经在尝试查找list.id是否在BataBase B中。所以,我终于在 DatabaseA 中得到了 2 个相同的数据。我该如何解决这个问题?
注意,我用的是C#
最佳答案
您可以使用 Lock 锁定操作.这样你就可以让线程互相等待。使用您的示例代码,它看起来像:
list=DataBaseO.getdata();
if(list.id not in DataBaseB)
{
lock(theLock) {
insert data into DatabaseA;
}
lock (theLock) {
insert log into DatabaseB;
}
}
在启动线程并使其可访问之前,您必须在某处声明“theLock”。锁对象可以是任何类型的对象,我个人倾向于只使用一个基本的对象。
请注意,如果您希望完成整个过程(将数据写入数据库 A 并将日志写入数据库 B),您也可以将这两个操作锁定在同一个锁中。在任何一种情况下,多线程都不会给您带来很大的性能提升,因为线程会不断地相互等待以访问数据库。
关于c# - SQL语句耗时长线程冲突如何解决?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31450066/