我可以使用带有数据上下文的事务,以便在出错后回滚上下文的状态吗?如果是这样,它是如何工作的?
问问题
41861 次
5 回答
19
我一直在测试中使用它们:)
try
{
dc.Connection.Open();
dc.Transaction = dc.Connection.BeginTransaction();
dc.SubmitChanges();
}
finally
{
dc.Transaction.Rollback();
}
更新
事后这总是会回滚。我在测试中使用它。
于 2009-05-15T09:07:11.773 回答
15
默认情况下,DataContext 会选择环境事务,因此只需确保范围内有事务即可。细节成为主要问题:
- 您需要哪些选项(例如隔离级别)
- 您想要一个新事务还是重用现有事务(例如,审计/日志记录操作可能需要一个新事务,以便即使整个业务操作失败并因此回滚外部事务也可以提交它)。
这是一些原型代码的简化,真正的代码使用助手来创建带有策略驱动选项的事务(原型的目的之一是检查这些选项的影响)。
using (var trans = new TransactionScope(
TransactionScopeOption.Required,
new TransactionOptions {
IsolationLevel = IsolationLevel.ReadCommitted
},
EnterpriseServicesInteropOption.Automatic)) {
// Perform operations using your DC, including submitting changes
if (allOK) {
trans.Complete();
}
}
如果 Complete() 没有被调用,那么事务将被回滚。如果存在包含事务范围,则内部事务和外部事务都需要完成才能提交数据库上的更改。
于 2009-05-15T10:12:35.800 回答
14
它不像 TransactionScope 方法那么简单,但据我了解,这是对 LINQ-to-SQL 执行此操作的“正确”方法。它不需要对 System.Transactions 的任何引用。
dataContext.Connection.Open();
using (dataContext.Transaction = dataContext.Connection.BeginTransaction())
{
dataContext.SubmitChanges();
if (allOK)
{
dataContext.Transaction.Commit();
}
else
{
dataContext.Transaction.RollBack();
}
}
当然,RollBack 只有在您打算在 using 中进行进一步的数据操作时才需要,否则更改将被自动丢弃。
于 2011-04-08T11:00:11.503 回答
10
大概是这样的:
try
{
using (TransactionScope scope = new TransactionScope())
{
//Do some stuff
//Submit changes, use ConflictMode to specify what to do
context.SubmitChanges(ConflictMode.ContinueOnConflict);
scope.Complete();
}
}
catch (ChangeConflictException cce)
{
//Exception, as the scope was not completed it will rollback
}
于 2009-05-15T10:11:41.853 回答
0
是这样的:
using (YourDatacontext m_DB = new YourDatacontext()) using (TransactionScope tran = new TransactionScope()) { try { //make here the changes m_DB.SubmitChanges(); tran.Complete(); } catch (Exception ex) { Transaction.Current.Rollback(); } }
于 2013-07-23T19:57:35.587 回答