gpt4 book ai didi

c# - 如何通过不同的 .net(c#) 线程处理多个 SQL 事务

转载 作者:搜寻专家 更新时间:2023-10-30 19:49:10 24 4
gpt4 key购买 nike

我有以下方法在表中批量插入数据。首先,我的代码将数据填充到数据表中,并使用 .net 的 SqlBulkCopy 类将这些数据插入相应的表中。

我要求数据应该插入所有表或都不插入。为此,我使用了 .net 的 SqlTransaction 类。

场景是,多个线程同时执行下面的代码块。

 public void Import()
{
using (SqlConnection sqlConnection = new SqlConnection(connectionString))
{

SqlTransaction sqlTrans =null;
try
{
sqlConnection.Open();
sqlTrans = sqlConnection.BeginTransaction(IsolationLevel.Serializable)


SqlCommand cmd = sqlConnection.CreateCommand();
cmd.CommandText = "select top 1 null from lockTable with(xlock)";
cmd.CommandTimeout = 3600*3;
cmd.Transaction = sqlTrans;
SqlDataReader reader = cmd.ExecuteReader();


foreach (DataTable dt in DataTables)
{
ImportIntoDatabase(sqlConnection, dt, sqlTrans);
}

reader.Close();
sqlTrans.Commit();
}
catch (Exception ex)
{
sqlTrans.Rollback();
throw ex;
}
}
}

private void ImportIntoDatabase(SqlConnection sqlConn, DataTable dt, SqlTransaction sqlTrans)
{
using (SqlBulkCopy bulkCopy = new SqlBulkCopy(sqlConn, SqlBulkCopyOptions.Default, sqlTrans))
{
bulkCopy.BulkCopyTimeout = dt.Rows.Count * 10;
try
{
bulkCopy.DestinationTableName = dt.TableName;
bulkCopy.WriteToServer(dt);
}
catch (Exception ex)
{
throw ex;
}
}
}

为了处理这种并发性,我在另一个表(批量插入表)所在的数据库中创建了一个虚拟表(名为“lockTable”的表)。我在命令超时高达 3 小时的 SqlTransaction 中获得了这个虚拟表的独占锁。

问题:我收到以下异常

: 无法访问目标表'Tbl1'(tbl1 是用于批量插入的表)

紧接着出现另一个异常,同时回滚catch block 中的事务

:执行事件时出错服务器未能恢复事务。描述:3a00000001。此 session 中事件的事务已被另一个 session 提交或中止。

任何人都可以帮助我解决代码的这种奇怪行为。我已经在互联网上搜索了很多关于这个问题的内容,但没有找到对我有帮助的内容。

最佳答案

In Import(DataTables 中的 DataTable dt)不会是线程安全的。

sqlConnection 已经有来自 Import 的事件读取器,因此无法在 ImportIntoDatabase 中使用连接。

Echo smp - 如果您要锁定一个表,那么为什么要多线程?

如果你想在 SQL 插入发生时建立输入,那么使用异步方法,例如 SqlCommand.BeginExecuteReader。您可以在没有线程开销的情况下获得异步。而 DataTables 相对较慢。我使用 TVP 和轻质物体插入。影响插入性能的一个重要因素是索引碎片。如果可能的话,按聚集索引的顺序插入顺序。循环是简单的构建输入,等待异步,运行异步。或者构建输入可以是从队列中读取的输入。对相同表的 SQL 插入通常不会并行得更快。我的经验是订购连续插入,插入之间没有时间间隔。

关于c# - 如何通过不同的 .net(c#) 线程处理多个 SQL 事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11408334/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com