的Linq未提交之前插入/修改时重新查询不准确问题
来园子已经两年了,每次都是看,这次咱也写一次。
说一下今天遇到的Linq问题:
每一次插入流水表时,都需要查找表中最大的流水号+1,并且将该流水号返回,但是在同一个SubmitChange之内插入多条时,流水号就一直是表中实际最大的,而不是我上一次插入的最大的。不描述了 贴代码:
这个是DataContext
- public class DataContext : LinqDataContext
- {
- public DataContext()
- : base()
- { }
- /// <summary>
- /// 打开隐式Linq事务
- /// 对于在BeginTransaction()之前已经SubmitChanges()的操作不在此事务之内。
- /// 开启事务以后,必须要Commit()提交事务才会更改到数据库中。
- /// </summary>
- public void BeginTransaction()
- {
- if (this.Connection.State == ConnectionState.Closed)
- {
- this.Connection.Open();
- this.Transaction = this.Connection.BeginTransaction();
- }
- }
- /// <summary>
- /// 提交隐式Linq事务
- /// 对于在BeginTransaction()之前已经SubmitChanges()的操作不在此事务之内。
- /// </summary>
- public void Commit()
- {
- if (this.Transaction != null)
- this.Transaction.Commit();
- }
- }
两个公用方法:
- /// <summary>
- /// 取得数据表中最大的Number值
- /// </summary>
- /// <param name="da"></param>
- /// <returns></returns>
- static int GetMaxNumber(DataContext da)
- {
- return (from v in da.LinqTable
- orderby v.Number descending
- select v.Number).FirstOrDefault();
- }
- static void Continue()
- {
- Console.WriteLine("请按任意键继续");
- Console.ReadKey();
- }
表结构:
- /*
- * LinqTable表结构
- * ID int 自增主键
- * Number int NOT NULL
- */
第一种情况:修改提交前可以重新查询获得已经更新的内容,读取的是内存中的 未使用隐式事务
- //假设数据表中只有一条数据 1 1
- Console.WriteLine("修改提交前可以重新查询获得已经更新的内容 未使用隐式事务");
- Continue();
- using (var da = new DataContext())
- {
- var single = (from v in da.LinqTable
- where v.ID.Equals()
- select v).Single();
- Console.WriteLine("读取ID为1的Number值为:" + single.Number);
- //输出:读取ID为1的Number值为:1
- Continue();
- single.Number = -single.Number;
- Console.WriteLine("将Number值修改为该值的相反数。");
- Continue();
- var newSingle = (from v in da.LinqTable
- where v.ID.Equals()
- select v).Single();
- Console.WriteLine("未提交之前重新查询ID为1的Number值为:" + newSingle.Number);
- //输出:未提交之前重新查询ID为1的Number值为::-1
- Continue();
- da.SubmitChanges();
- var submitSingle = (from v in da.LinqTable
- where v.ID.Equals()
- select v).Single();
- Console.WriteLine("提交之后重新查询ID为1的Number值为:" + submitSingle.Number);
- //输出:提交之后重新查询ID为1的Number值为:-1
- Continue();
- }
- /*
- * 修改时,在未提交之前重新查询改对象的值是查询内存中的
- * 但是新增时又不一样,请看下面
- */
- 第二种情况:添加后未提交前取得的最大的Number值永远是数据表中真实的值,不是内存中的 未使用隐式事务
- //假设数据表中只有一条数据 1 1
- using (var da = new DataContext())
- {
- LinqTable t1 = new LinqTable()
- {
- Number = GetMaxNumber(da) + ,
- };
- da.LinqTable.InsertOnSubmit(t1);
- Console.WriteLine("添加t1,t1的Number为:" + t1.Number + ",此时重新查询最大的Number为:" + GetMaxNumber(da));
- //输出:添加t1,t1的Number为:2,此时重新查询最大的Number为:1
- //想要的效果:添加t1,t1的Number为:2,此时重新查询最大的Number为:2
- Continue();
- LinqTable t2 = new LinqTable()
- {
- Number = GetMaxNumber(da) + ,
- };
- da.LinqTable.InsertOnSubmit(t2);
- Console.WriteLine("添加t2,t2的Number为:" + t2.Number + ",此时重新查询最大的Number为:" + GetMaxNumber(da));
- //输出:添加t2,t2的Number为:2,此时重新查询最大的Number为:1
- //想要的效果:添加t2,t2的Number为:3,此时重新查询最大的Number为:3
- Continue();
- da.SubmitChanges();
- }
- /*
- * 根据第一种情况,结果应该是我想要的那种结果,但事实上不是。
- * 这个是什么原因呢?求解。
- */
第三种情况:开启隐式事务,添加后提交前取得的最大的Number值是我想要的值,最后再Commit
- //假设数据表中只有一条数据 1 1
- using (var da = new DataContext())
- {
- da.BeginTransaction();//开启隐式事务
- LinqTable t1 = new LinqTable()
- {
- Number = GetMaxNumber(da) + ,
- };
- da.LinqTable.InsertOnSubmit(t1);
- da.SubmitChanges();//插入后立即提交
- Console.WriteLine("添加t1,t1的Number为:" + t1.Number + ",此时重新查询最大的Number为:" + GetMaxNumber(da));
- //输出:添加t1,t1的Number为:2,此时重新查询最大的Number为:2
- //是我想要的效果
- Continue();
- LinqTable t2 = new LinqTable()
- {
- Number = GetMaxNumber(da) + ,
- };
- da.LinqTable.InsertOnSubmit(t2);
- da.SubmitChanges();//插入后立即提交
- Console.WriteLine("添加t2,t2的Number为:" + t2.Number + ",此时重新查询最大的Number为:" + GetMaxNumber(da));
- //输出:添加t2,t2的Number为:3,此时重新查询最大的Number为:3
- //是我想要的效果
- Continue();
- da.Commit();
- }
- /*
- * 这次开启了隐式事务,达到了我想要的结果,但是第二种情况为什么不行?
- * TransactionCope 需要开启DTC 不建议使用
- */
这就是今天遇到的问题,现在没办法只能开启隐式事务了,不过为什么第二种情况达不到我想要的结果呢?求大神解。
的Linq未提交之前插入/修改时重新查询不准确问题的更多相关文章
- iOS利用Application Loader打包提交到App Store时遇到错误The filename 未命名.ipa in the package contains an invalid character(s). The valid characters are:A-Z ,a-z,0-9,dash,period,underscore,but the name cannot start w
iOS利用Application Loader打包提交到App Store时遇到错误: The filename 未命名.ipa in the package contains an invalid ...
- SVN提交修改时出现:Checksum mismatch
在使用SVN commit提交修改时,提示Checksum mismatch 问题,提示版本不一致,不能提交,类似于下图. 图片来源于网络,如有侵权,请告知删除. 搜索stackoverflow.co ...
- Linq to SQL - 撤销所有未提交的改动
在某些情况下我们需要撤销/丢弃所有未提交的改动,包括Update, Delete和Insert.context中GetChangeSet()方法可以返回当前所有未提交的改动,而我们的目标是清空Chan ...
- c#执行插入sql 时,报错:异常信息:超时时间已到。在操作完成之前超时时间已过或服务器未响应
问题:c#执行插入sql 时,报错:异常信息:超时时间已到.在操作完成之前超时时间已过或服务器未响应 解决: SqlCommand cmd = new SqlCommand(); cmd.Comman ...
- 使用layui框架 修改时部分参数未传给后台(查找原因)
采用的结构: <form class="layui-form reset-form" action="" id="formData"& ...
- 触发器修改后保存之前的数据 表中插入数据时ID自动增长
create or replace trigger t before update on test5 for each rowbegin insert into test55 values (:old ...
- SQL Server 中的事务与事务隔离级别以及如何理解脏读, 未提交读,不可重复读和幻读产生的过程和原因
原本打算写有关 SSIS Package 中的事务控制过程的,但是发现很多基本的概念还是需要有 SQL Server 事务和事务的隔离级别做基础铺垫.所以花了点时间,把 SQL Server 数据库中 ...
- 检查点(Checkpoint)过程如何处理未提交的事务
每次我讲解SQL Server之前,我都会先简单谈下当我们执行查询时,在SQL Server内部发生了什么.执行一个SELECT语句非常简单,但是执行DML语句更加复杂,因为SQL Server要修改 ...
- SQL Server中的事务与其隔离级别之脏读, 未提交读,不可重复读和幻读
原本打算写有关 SSIS Package 中的事务控制过程的,但是发现很多基本的概念还是需要有 SQL Server 事务和事务的隔离级别做基础铺垫.所以花了点时间,把 SQL Server 数据库中 ...
随机推荐
- TCP协议滑动窗口(一)——控制大批量数据传输速率
窗口大小:TCP头中一个16位的域,表示当前可用接受缓冲区大小.在每个TCP对等段连接初始化时,告诉对方自己的窗口大小(不一定是满额,假如满额65201字节,可能暂时通告5840字节).若客户端接受数 ...
- 关于在win7旗舰版32位上 安装 net4.0 的闪退问题研究 和安装sqlserver2008问题
1.配置文件客户端[目标x86x64]的 可以安装 2.配置文件完全的目标x86x64的 出现闪退. 3.服务器核心的出现无法安装 安装 sqlserver 2008R2数据库 报错 \最后留下了它, ...
- Centos初始化硬盘分区、挂载
刚刚买了一台服务器,刚买的服务器的数据盘都是需要自己来分区的,下面就记录一下操作. 通过命令fdisk-l查看硬盘信息 可以看到有两块硬盘/dev/vda和/dev/vdb,启动vda是系统盘vdb是 ...
- 一文详解Spring Cloud Feign重试机制
前言 Feign组件默认使用Ribbon的重试机制并增加了根据状态码判断重试机制,默认情况下是不启用的.Feign使用的是Spring Retry组件,需要引入依赖才能启用. 一.POM引入Sprin ...
- Math.floor() 与 parseInt()
parseInt()与Math.floor()都能实现数字的向下取整,但是两者存在根本上的差异,1.Math.floor()用于一个数的向下取整,不能解析字符串 <script type=&qu ...
- iptables详解(3):iptables规则管理
所属分类:IPtables Linux基础 在本博客中,从理论到实践,系统的介绍了iptables,如果你想要从头开始了解iptables,可以查看iptables文章列表,直达链接如下 iptab ...
- 通过JS唤醒app(安卓+ios)
有需求说要通过页面按钮唤醒app,或者手机上没有这款app跳转到商店,然后刚开始也是查了资料的,结果发现一头雾水,不过最后还是捣鼓出来了,当然也参考了前人分享的经验,下面我就将方法整理一下: 首先明确 ...
- POJ 2823 Sliding Window & Luogu P1886 滑动窗口
Sliding Window Time Limit: 12000MS Memory Limit: 65536K Total Submissions: 66613 Accepted: 18914 ...
- Nginx配置文件的高亮显示设置
linux系统下vim或者vi编辑器默认是没有对nginx的语法高亮设置. 1.下载vi语法高亮配置到 ~/.vim/syntax,如果不存在则创建该目录,cd ~/.vim/syntax wget ...
- JQ + PHP + TrackMore物流信息跟踪
在使用之前,您需要先去trackmore官方网站申请API_KEY,传送门:TrackMore html <script type="text/javascript" src ...