EF架构~关系表插入应该写在事务里
来源:互联网 发布:c语言考研知识点总结 编辑:程序博客网 时间:2024/05/18 00:26
这个标题很有意思,关系表插入,就是说主表和外表键在插入时,可能会有同步插的情况,如在建立主表时,扩展表需要同步完成数据的初始化工作,而对于多表插入时,我们为了保证数据的一致性会针它写在事务中,而对于.net中的事件,它在一些情况下,会不那么单纯,对于ef和linq to sql来说,你的事务如果出现多次提交动作(submitchange | savechanges),那么,.net这边会把它提升为分布式事务(MSDTC),即.net认为,对于一个数据表的操作,不会出现多个savechanges,OK,这个可以解释的通,一个数据库,一个提交,这是符合性能要求的,呵呵,但对于我们的架构来说,有时一疏忽,就违背了.net的这个原则,如,我们封装的Insert方法,可能是这样的
public virtual void Insert(TEntity item) { Db.Entry<TEntity>(item); Db.Set<TEntity>().Add(item); this.SaveChanges(); }
这个代码也没有问题,在一个插入动作完成后,系统由SaveChanges方法完成一次提交,正是由于这样的代码,所以我们的麻烦就来了,如果是对两个表的操作吗?
aRepository.Insert(a);bRepository.Insert(b);
什么问题?数据一致性不能保证,因为没有事务块,呵呵,加上了再看看
using (TransactionScope trans = new TransactionScope()){ aRepository.Insert(a); bRepository.Insert(b); trans.Commit();}
OK,感觉是没有问题了,但细一想就会看出问题来了,因为我们封装的insert会有提交动作,所以,在这个事务块中,.net会被认识是一个MSDTC(分布式的事务),原因是提交了多次,而如果你没有打开msdtc服务的话,就会出现下面的黄屏了
注意:系统触发分布式事务的前提是你的WEB服务器与数据库服务器分别部署在两个服务器上,一台不会出现这个问题的。
今天我们要说的是在插入关系表时,怎样使它不被提升为分布式事务,事实上,怎么做我们已经知道了,就是方法中只出现一个savechages,呵呵,而对于主表与扩展表来说,对于自增主键的主表,做起来就有些麻烦了,呵呵,我们还需要借助SQL函数来实现主键的获取工作,当主键插入后,通过SQL函数得到新值,然后再为扩展表赋值,最后一些savechange()就可以了,具体我们看一下代码:
int maxID = Convert.ToInt32(new TsingDa_NewLearningBarEntities()//当前表最大ID .Database.SqlQuery<decimal>("SELECT IDENT_CURRENT ('Classroom_Info')") .First()); using (TransactionScope trans = new TransactionScope()) { try { db.Entry<Classroom_Info>(entity); db.Set<Classroom_Info>().Add(entity); //绑定学生 entity.User_Classroom_R.ToList().ForEach(i => { i.ClassroomInfoID = maxID + 1; db.Entry<User_Classroom_R>(i); db.Set<User_Classroom_R>().Add(i); }); db.SaveChanges();//是否为msdtc就看它提交的次数 trans.Complete(); } catch (Exception) { trans.Dispose();//出现异常,事务手动释放 throw; } }
而一次savechanges所产生的SQL也是我们可以接受的,与服务器连接池中开启一个新连接,然后把语句一条一条的发过去,虽然不是一次性发送,但结果我们也是可以接受的,呵呵。
- EF架构~关系表插入应该写在事务里
- EF架构~关系表插入应该写在事务里,但不应该是分布式事务
- EF里实体关系配置的方法
- ef事务
- EF 事务
- 分享我们项目中基于EF事务机制的架构
- 项目中基于EF事务机制的架构
- 【内存管理】:谁应该写在viewDidUnload里,谁应该写在dealloc里,arc之后viewDidUnload怎么用
- 【内存管理】:谁应该写在viewDidUnload里,谁应该写在dealloc里,arc之后viewDidUnload怎么用
- 【内存管理】:谁应该写在viewDidUnload里,谁应该写在dealloc里,arc之后viewDidUnload怎么用
- EF 自带事务
- EF操作-事务
- 应该写在一周前
- 毕业了是应该考个研还是考个证儿?——写在MBA课程最后的日子里
- EF 批插入
- EF里一对一、一对多、多对多关系的配置和级联删除
- EF架构封装类
- EF架构之二
- 传奇源码分析---框架
- mysql语法
- Wireshark基本介绍和学习TCP三次握手
- unity ik
- 程序员 笔试资料 个人整理
- EF架构~关系表插入应该写在事务里
- #pragma命令详解
- 左连接、右连接和全连接的区别
- 山东父母的教育关键
- linux 根目录的目录结构
- linux中 likely与unlikely
- 条码扫描二维码扫描——ZXing android 源码简化
- IKanalyzer 简单分词
- ubuntug上使用virtualbox和子系统xp共享文件