程序中实现回滚,无法回滚的问题,请帮助分析

shusong1228 2013-12-06 03:24:10
现场: 使用批处理往数据库服务器上提交记录,但有时候出现重复提交记录的情况;程序大致的逻辑是这样的,每次提交时,如果出现错误或者超市,则执行回滚,等下次继续提交。

试了MSDN上C# SqlBulkCopy示例代码提供的2种事务方式都不行

以前采用数据库连接中BeginTransaction 事务方式,日志中看到:有Rollback() Exception! 回滚异常 代码见“事务1”,后来改成了利用SqlBulkCopy本身带的事务,NEW SqlBulkCopy 增加参数:SqlBulkCopyOptions.UseInternalTransaction 代码见“事务2”.

事务1:

SqlTransaction pTrans = null;

bool bResult = false;

try
{
pTrans = db.Sqlconnection.BeginTransaction();

using (SqlBulkCopy bcp = new SqlBulkCopy(db.Sqlconnection, SqlBulkCopyOptions.FireTriggers, pTrans))
{
try
{
bcp.DestinationTableName = table.TableName;
bcp.WriteToServer(table);

pTrans.Commit();
bResult = true;
}
catch (System.Exception e)
{

bool bRollback = false;
try
{
pTrans.Rollback(); --回滚
bRollback = true;
}
catch (System.Exception ex)
{
String strErrorMessage1 = "Rollback() Exception!";
bRollback = false;
}

if (bRollback)
{
AnalysisException(e, table);
}

bool result = db.Open(); //重连

if (result)
{
error = "reconnect successfully ";
}
else
{
error = "reconnect failed ";
}
return false;
}
}
}
catch (System.Exception e)
{
bool result = db.Open(); //重连
String error;
if (result)
{
error = "reconnect successfully ";
}
else
{
error = "reconnect failed ";
}
return false;
}

事务2:
bool bResult = false;
try
{
using (SqlBulkCopy bcp = new SqlBulkCopy(db.Sqlconnection, SqlBulkCopyOptions.FireTriggers | SqlBulkCopyOptions.UseInternalTransaction, null))
{
try
{
bcp.DestinationTableName = table.TableName;
bcp.WriteToServer(table);
bResult = true;
}
catch (System.Exception e)
{

bool result = db.Open(); //重连
String error;
if (result)
{
AnalysisException(e, table);
error = "reconnect successfully ";
}
else
{
error = "reconnect failed ";
}
return false;
}
}
}
catch (System.Exception e)
{
bool result = db.Open(); //重连
String error;
if (result)
{
error = "reconnect successfully ";
}
else
{
error = "reconnect failed ";
}
return false;
}
...全文
309 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
KeepSayingNo 2013-12-12
  • 打赏
  • 举报
回复
你把目标表清空,然后批量提交不要放到线程中做,只让批量提交一次,如果发生失败回滚,看看目标表是否有数据,如果回滚了不可能有数据提交到目标表
shusong1228 2013-12-12
  • 打赏
  • 举报
回复
引用 7 楼 dotnetstudio 的回复:
看你的目标表上面建了触发器没,如果没有建触发器,那就不需要这项了,直接用我的
目标表有触发器。 还是有回滚失败,重复提交记录的情况发生,不知道咋回事了。
KeepSayingNo 2013-12-12
  • 打赏
  • 举报
回复
看你的目标表上面建了触发器没,如果没有建触发器,那就不需要这项了,直接用我的
shusong1228 2013-12-12
  • 打赏
  • 举报
回复
引用 5 楼 dotnetstudio 的回复:
你这样试试看

 using (SqlBulkCopy bcp = new SqlBulkCopy(db.Sqlconnection, SqlBulkCopyOptions.UseInternalTransaction))
跟原来的有啥不同:using (SqlBulkCopy bcp = new SqlBulkCopy(db.Sqlconnection, SqlBulkCopyOptions.FireTriggers | SqlBulkCopyOptions.UseInternalTransaction, null))
t101lian 2013-12-09
  • 打赏
  • 举报
回复
在数据库中实现。。。
KeepSayingNo 2013-12-09
  • 打赏
  • 举报
回复
你这样试试看

 using (SqlBulkCopy bcp = new SqlBulkCopy(db.Sqlconnection, SqlBulkCopyOptions.UseInternalTransaction))
shoppo0505 2013-12-06
  • 打赏
  • 举报
回复
把rollback交给数据库自己做,别放在程序中。 现在这样的情况,吃力不讨好。
LongRui888 2013-12-06
  • 打赏
  • 举报
回复
尽量别用数据库连接的那个 begin transaction,那个会导致一些问题的。 尽量在语句中直接用begin transaction,失败了rollback tran
發糞塗牆 2013-12-06
  • 打赏
  • 举报
回复
你这个发去C#版比较好,我觉得t-sql里面和C#里面都要做回滚才安全

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧