我有以下方法在表中批量插入数据。首先,我的代码填充数据表中的数据,并使用 .net 的 SqlBulkCopy claas 将此数据插入相应的表中。
我要求数据应该插入所有表中,或者都不插入。为此,我使用了 .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”的表)。我在 SqlTransaction 中的这个虚拟表上获得了排他锁,命令超时时间高达 3 小时。
问题:我收到以下异常
: 无法访问目标表 'Tbl1'(tbl1 是用于批量插入的表)
紧随其后的是另一个异常,同时在 catch 块中回滚事务
:执行活动时出错服务器无法恢复事务。描述:3a00000001。此会话中活动的事务已被另一个会话提交或中止。
任何人都可以帮助我解决代码的这种奇怪行为。我已经在互联网上搜索了很多关于这个问题的信息,但我没有发现任何对我有帮助的东西。