EF 事务

http://yanwushu.byethost7.com/?p=87

1. EF对事务进行了封装:context的saveChange()是有事务性的。

2. 依赖多个不同的Context的操作(即分布式操作)或者多次调用context.saveChanges()操作,会脱离EF事务封装,此时可使用TransactionScope实现事务操作。案例代为:

  1. using (TransactionScope scope = new TransactionScope())
  2. {
  3. //Do something with context1
  4. //Do something with context2
  5. //Save and discard changes
  6. context1.SaveChanges();
  7. //Save and discard changes
  8. context2.SaveChanges();
  9. //if we get here things are looking good.
  10. scope.Complete();
  11. }

但是这样写是有风险的,假 如context1.SaveChanges()成功了,context2.SaveChanges()失败,在scope.Complete()提交事务的时候就会终止,而Context1已经成功执行了这可能不一定符合的需要。如果需要 context1、context2要不同时执行成功,要不都不成功,需要对代码作小小的调整,如用下面的代码:

  1. using (TransactionScope scope = new TransactionScope())
  2. {
  3. //Do something with context1
  4. //Do something with context2
  5. //Save Changes but don't discard yet
  6. context1.SaveChanges(false);
  7. //Save Changes but don't discard yet
  8. context2.SaveChanges(false);
  9. //if we get here things are looking good.
  10. scope.Complete();
  11. context1.AcceptAllChanges();
  12. context2.AcceptAllChanges();
  13. }

用SaveChanges(false)先将必要的数据库操作命令发送给数据库,这是注意context1与context2并没有真正发生改变,如果事务终止,自动回滚,两者的更改都没有真正提交到数据库,所以是可以成功回滚的。

上一篇:tibble包:高效显示表格数据的结构


下一篇:a标签 href不跳转 禁止跳转