c# - SQL语句耗时长线程冲突如何解决?

标签 c# sql multithreading sql-server-2008

我要从数据库 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/

相关文章:

c# - 构建通用集合类

SQL 2008 不与 top 子句执行并行

c# - 绑定(bind)在 WPF MVVM C#​​ 中不起作用

c# - .Net 核心 2.2 未将 302 的状态代码更新为 401。OnRedirectToLogin 事件未触发

sql - 如何在 SQLite 中搜索子字符串?

ios - 如何提高堆叠式 GPUImage 过滤器的性能

java - 在多线程环境中用 C# 和 Java 编写同一程序时获得不同的输出

java - 扩展Thread并同时实现runnable

c# - Entity Framework 在使用 Find() 时生成低效的选择

mysql - 在MySQL中实现以下操作的更好方法?