修改并发异常ChangeConfictException//测试修改并发异常ChangeConfictExceptionvar query = from p in ctx.Productswhere p.CategoryID == 1select p;foreach (var p in query){p.UnitsInStock = Convert.ToInt16(p....
修改并发异常ChangeConfictException
//测试修改并发异常ChangeConfictException var query = from p in ctx.Products where p.CategoryID == 1 select p; foreach (var p in query) { p.UnitsInStock = Convert.ToInt16(p.UnitsInStock - 1); } ctx.SubmitChanges();// 在这里设断点,程序运行到此处时,在数据库执行如下T_SQL操作 /* UPDATE dbo.Products SET UnitsInStock = UnitsInStock - 2 WHERE CategoryID=1 */ //然后继续运行程序,会抛出修改并发异常ChangeConfictException /* 原因分析:当客户端提交的修改对象自读取之后已经在数据库中发生改动,就产生了修改并发。*/ /* 不考虑并发修改异常设置:实体类属性column特性增加UpdateCheck = UpdateCheck.Never * 不考虑并发修改异常情况下,默认是最后一次更新起作用 */
处理修改并发异常ChangeConfictException
//处理修改并发异常ChangeConfictException var query = from p in ctx.Products where p.ProductID == 1 select p; foreach (var p in query) { p.UnitsInStock = Convert.ToInt16(p.UnitsInStock - 1); } try { ctx.SubmitChanges(ConflictMode.ContinueOnConflict); } catch (ChangeConflictException) { foreach (ObjectChangeConflict cc in ctx.ChangeConflicts) { Products product = (Products)cc.Object; cc.Resolve(RefreshMode.OverwriteCurrentValues);// 放弃当前进程更新,所有更新以原先其它进程更新为准 //cc.Resolve(RefreshMode.KeepCurrentValues); // 放弃原先其它进程更新,所有更新以当前进程更新为准 //cc.Resolve(RefreshMode.KeepChanges); // 原先其它进程更新有效,冲突字段以当前进程更新为准 } } ctx.SubmitChanges();
//针对不同策略处理不同字段修改并发异常ChangeConfictException var query = from p in ctx.Products where p.ProductID == 1 select p; foreach (var p in query) { p.UnitsInStock = Convert.ToInt16(p.UnitsInStock - 1); } try { ctx.SubmitChanges(ConflictMode.ContinueOnConflict); } catch (ChangeConflictException) { //遍历并发冲突对象集合 foreach (ObjectChangeConflict cc in ctx.ChangeConflicts) { //遍历当前冲突对象更新失败的成员(即更新失败的列) foreach (MemberChangeConflict mc in cc.MemberConflicts) { if (mc.Member.Name == "UnitsInStock") { mc.Resolve(RefreshMode.KeepCurrentValues); // 放弃原先其它进程更新,所有更新以当前进程更新为准 } else if (mc.Member.Name == "UnitPrice") { mc.Resolve(RefreshMode.OverwriteCurrentValues); // 放弃当前进程更新,所有更新以原先其它进程更新为准 } else { mc.Resolve(RefreshMode.KeepChanges); // 原先其它进程更新有效,冲突字段以当前进程更新为准 } } } } ctx.SubmitChanges();
事务:
//Linq to sql在提交更新的时候默认会创建事务,一部分修改发生错误的话其它修改也不会生效: //假设数据库中已经存在顾客ID为“ALFKI”的记录,那么第二次插入操作失败将会导致第一次的插入操作失效。 ctx.Customers.InsertOnSubmit(new Customers { CustomerID = "abcdf", CompanyName = "zhuye" }); ctx.Customers.InsertOnSubmit(new Customers { CustomerID = "ALFKI", CompanyName = "zhuye" }); ctx.SubmitChanges();
使用事务
ctx.Connection.Open(); ctx.Transaction = ctx.Connection.BeginTransaction(); ctx.Customers.InsertOnSubmit(new Customers { CustomerID = "abcdf", CompanyName = "zhuye" }); ctx.Customers.InsertOnSubmit(new Customers { CustomerID = "ALFKI", CompanyName = "zhuye" }); try { ctx.SubmitChanges(); ctx.Transaction.Commit(); } catch { ctx.Transaction.Rollback(); } ctx.Connection.Close();
使用TransactionScope
using (TransactionScope tranScope = new TransactionScope()) { ctx.Customers.InsertOnSubmit(new Customers { CustomerID = "abcdf", CompanyName = "zhuye" }); ctx.Customers.InsertOnSubmit(new Customers { CustomerID = "ALFKI", CompanyName = "zhuye" }); tranScope.Complete(); }
沃梦达教程
本文标题为:Linq to Sql学习总结5
基础教程推荐
猜你喜欢
- C#使用dynamic一行代码实现反射操作 2023-07-19
- C#使用LINQ查询操作符实例代码(一) 2023-06-09
- c# – 使用interger变量与硬编码整数值相比,Linq to SQL查询非常慢 2023-11-23
- C#窗体实现酒店管理系统 2023-06-27
- C#基于winform实现音乐播放器 2023-05-17
- c#使用Socket发送HTTP/HTTPS请求的实现代码 2022-11-10
- unity实现手游虚拟摇杆 2023-02-16
- c# – 如何从Visual Studio中的包管理器控制台调用针对SQL Azure的update-database? 2023-11-23
- 详解C#方法中使用out参数做登录判断代码实例 2023-01-22
- c# for循环中创建线程执行问题 2023-05-06