我在用着TransactionScope
进行一些批量插入和更新。问题是,即使我设置了超时,我也会在 30 分钟长的操作中遇到超时异常TransactionScope
到一小时。
此外,在异常之后,它会插入看似随机数量的批次记录。例如,最后一个操作有 12440 条插入,超时后有 7673 条记录插入到表中。
的超时时间为SqlConnection
and SqlCommand
都设置为int.MaxValue
.
我究竟做错了什么?
这是我的代码:
using (TransactionScope transaction = new TransactionScope(TransactionScopeOption.Required, TimeSpan.FromHours(1)))
{
try
{
using (db = new DB())
{
//operations here
}
}
catch (Exception ex)
{
throw new Exception("DB Error:\r\n\r\n" + ex.Message);
}
transaction.Complete();
} // <--- Exception here: Transaction aborted (Inner exception: Timeout)
您的交易是否在 10 分钟后失败?如果是这样,您可能正在点击事务管理器最大超时 http://msdn.microsoft.com/en-us/library/system.transactions.transactionmanager.maximumtimeout.aspx这是在 machine.config 中设置的。如果我没记错的话,如果您尝试设置大于最大值的超时,那么您的设置将被忽略。尝试增加 machine.config 中的值,看看这是否对您的问题有帮助。
就随机提交而言,您是否设置Transaction Binding=Explicit Unbind
在你的连接字符串上?默认值为Transaction Binding=Implicit Unbind
. From MSDN http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.connectionstring.aspx:
隐式解除绑定导致连接
当它从事务中分离
结束。分离后,附加
连接上的请求是
在自动提交模式下执行。这
系统.交易.交易.当前
执行时不检查属性
交易期间的请求
积极的。交易完成后
已结束,还有其他请求
在自动提交模式下执行。
基本上,当事务超时时,截至该点的所有插入都将回滚,但使用同一连接完成的任何其他插入都将以自动提交模式完成,其中每个插入语句都将立即提交。这听起来确实与您所看到的场景类似(但如果不看到完整的代码/重现就很难知道)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)