linq中单表的操作本来是通过自身的事务处理操作的,但是,多个表之间的数据同步操作就不行了。我们也
可以用sql中的事务机制,其实也是一个道理。
我们要使用TransactionScope,必须添加System.Transactions.dll引用。
①我们先看一个可以正确插入的例子:
using (TransactionScope scope = new TransactionScope())
{
M_Test_QBank_Choose m = new M_Test_QBank_Choose();
m.QContent = "111";
m.LessonNum = "111";
m.Answer = "111";
m.AnswerIndex = "111";
m.TeacherID = "10000";
BLL.M_Test_QBank_ChooseBLL.Insert(m); // insert方法里面已经submitChanges
int a = m.id;
scope.Complete();
}
a可以拿到插入的记录的id。
②我们来模拟一个插入出错的情景:
using (TransactionScope scope = new TransactionScope())
{
M_Test_QBank_Choose m = new M_Test_QBank_Choose();
m.QContent = "111";
m.LessonNum = "111";
m.Answer = "111";
m.AnswerIndex = "111";
m.TeacherID = "10000";
BLL.M_Test_QBank_ChooseBLL.Insert(m);
int a = m.id;
int b = Convert.ToInt32("aaa");
scope.Complete();
}
a可以拿到插入的记录,但是下面出错,就会回滚,数据库中不会有插入的记录。
这里的scope.Complete();会将里面的多个表的操作同时提交。如果不成功则会自动回滚。
关于Linq事务的详细说明,请参见我新浪博客转载的文章《Linq to SQL 事务》
http://blog.sina.com.cn/s/blog_67aaf4440100sbyb.html
关于使用时提示,请参见我的新浪博客:《MSDTC不可用解决办法》