来园子已经两年了,每次都是看,这次咱也写一次。

说一下今天遇到的Linq问题:

每一次插入流水表时,都需要查找表中最大的流水号+1,并且将该流水号返回,但是在同一个SubmitChange之内插入多条时,流水号就一直是表中实际最大的,而不是我上一次插入的最大的。不描述了 贴代码:

这个是DataContext

  1. public class DataContext : LinqDataContext
  2. {
  3. public DataContext()
  4. : base()
  5. { }
  6.  
  7. /// <summary>
  8. /// 打开隐式Linq事务
  9. /// 对于在BeginTransaction()之前已经SubmitChanges()的操作不在此事务之内。
  10. /// 开启事务以后,必须要Commit()提交事务才会更改到数据库中。
  11. /// </summary>
  12. public void BeginTransaction()
  13. {
  14. if (this.Connection.State == ConnectionState.Closed)
  15. {
  16. this.Connection.Open();
  17. this.Transaction = this.Connection.BeginTransaction();
  18. }
  19. }
  20.  
  21. /// <summary>
  22. /// 提交隐式Linq事务
  23. /// 对于在BeginTransaction()之前已经SubmitChanges()的操作不在此事务之内。
  24. /// </summary>
  25. public void Commit()
  26. {
  27. if (this.Transaction != null)
  28. this.Transaction.Commit();
  29. }
  30. }

两个公用方法:

  1. /// <summary>
  2. /// 取得数据表中最大的Number值
  3. /// </summary>
  4. /// <param name="da"></param>
  5. /// <returns></returns>
  6. static int GetMaxNumber(DataContext da)
  7. {
  8. return (from v in da.LinqTable
  9. orderby v.Number descending
  10. select v.Number).FirstOrDefault();
  11. }
  12.  
  13. static void Continue()
  14. {
  15. Console.WriteLine("请按任意键继续");
  16. Console.ReadKey();
  17. }

表结构:

  1. /*
  2. * LinqTable表结构
  3. * ID int 自增主键
  4. * Number int NOT NULL
  5. */

第一种情况:修改提交前可以重新查询获得已经更新的内容,读取的是内存中的 未使用隐式事务

  1. //假设数据表中只有一条数据 1 1
  2.  
  3. Console.WriteLine("修改提交前可以重新查询获得已经更新的内容 未使用隐式事务");
  4. Continue();
  5. using (var da = new DataContext())
  6. {
  7. var single = (from v in da.LinqTable
  8. where v.ID.Equals()
  9. select v).Single();
  10. Console.WriteLine("读取ID为1的Number值为:" + single.Number);
  11. //输出:读取ID为1的Number值为:1
  12. Continue();
  13. single.Number = -single.Number;
  14. Console.WriteLine("将Number值修改为该值的相反数。");
  15. Continue();
  16. var newSingle = (from v in da.LinqTable
  17. where v.ID.Equals()
  18. select v).Single();
  19. Console.WriteLine("未提交之前重新查询ID为1的Number值为:" + newSingle.Number);
  20. //输出:未提交之前重新查询ID为1的Number值为::-1
  21. Continue();
  22. da.SubmitChanges();
  23. var submitSingle = (from v in da.LinqTable
  24. where v.ID.Equals()
  25. select v).Single();
  26. Console.WriteLine("提交之后重新查询ID为1的Number值为:" + submitSingle.Number);
  27. //输出:提交之后重新查询ID为1的Number值为:-1
  28. Continue();
  29. }
  30.  
  31. /*
  32. * 修改时,在未提交之前重新查询改对象的值是查询内存中的
  33. * 但是新增时又不一样,请看下面
  34. */
  1. 第二种情况:添加后未提交前取得的最大的Number值永远是数据表中真实的值,不是内存中的 未使用隐式事务
  1. //假设数据表中只有一条数据 1 1
  2. using (var da = new DataContext())
  3. {
  4. LinqTable t1 = new LinqTable()
  5. {
  6. Number = GetMaxNumber(da) + ,
  7. };
  8. da.LinqTable.InsertOnSubmit(t1);
  9. Console.WriteLine("添加t1,t1的Number为:" + t1.Number + ",此时重新查询最大的Number为:" + GetMaxNumber(da));
  10. //输出:添加t1,t1的Number为:2,此时重新查询最大的Number为:1
  11. //想要的效果:添加t1,t1的Number为:2,此时重新查询最大的Number为:2
  12. Continue();
  13. LinqTable t2 = new LinqTable()
  14. {
  15. Number = GetMaxNumber(da) + ,
  16. };
  17. da.LinqTable.InsertOnSubmit(t2);
  18. Console.WriteLine("添加t2,t2的Number为:" + t2.Number + ",此时重新查询最大的Number为:" + GetMaxNumber(da));
  19. //输出:添加t2,t2的Number为:2,此时重新查询最大的Number为:1
  20. //想要的效果:添加t2,t2的Number为:3,此时重新查询最大的Number为:3
  21. Continue();
  22. da.SubmitChanges();
  23. }
  24.  
  25. /*
  26. * 根据第一种情况,结果应该是我想要的那种结果,但事实上不是。
  27. * 这个是什么原因呢?求解。
  28. */

第三种情况:开启隐式事务,添加后提交前取得的最大的Number值是我想要的值,最后再Commit

  1. //假设数据表中只有一条数据 1 1
  2. using (var da = new DataContext())
  3. {
  4. da.BeginTransaction();//开启隐式事务
  5. LinqTable t1 = new LinqTable()
  6. {
  7. Number = GetMaxNumber(da) + ,
  8. };
  9. da.LinqTable.InsertOnSubmit(t1);
  10. da.SubmitChanges();//插入后立即提交
  11. Console.WriteLine("添加t1,t1的Number为:" + t1.Number + ",此时重新查询最大的Number为:" + GetMaxNumber(da));
  12. //输出:添加t1,t1的Number为:2,此时重新查询最大的Number为:2
  13. //是我想要的效果
  14. Continue();
  15. LinqTable t2 = new LinqTable()
  16. {
  17. Number = GetMaxNumber(da) + ,
  18. };
  19. da.LinqTable.InsertOnSubmit(t2);
  20. da.SubmitChanges();//插入后立即提交
  21. Console.WriteLine("添加t2,t2的Number为:" + t2.Number + ",此时重新查询最大的Number为:" + GetMaxNumber(da));
  22. //输出:添加t2,t2的Number为:3,此时重新查询最大的Number为:3
  23. //是我想要的效果
  24. Continue();
  25. da.Commit();
  26. }
  27.  
  28. /*
  29. * 这次开启了隐式事务,达到了我想要的结果,但是第二种情况为什么不行?
  30. * TransactionCope 需要开启DTC 不建议使用
  31. */

这就是今天遇到的问题,现在没办法只能开启隐式事务了,不过为什么第二种情况达不到我想要的结果呢?求大神解。

  1.  

的Linq未提交之前插入/修改时重新查询不准确问题的更多相关文章

  1. 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 ...

  2. SVN提交修改时出现:Checksum mismatch

    在使用SVN commit提交修改时,提示Checksum mismatch 问题,提示版本不一致,不能提交,类似于下图. 图片来源于网络,如有侵权,请告知删除. 搜索stackoverflow.co ...

  3. Linq to SQL - 撤销所有未提交的改动

    在某些情况下我们需要撤销/丢弃所有未提交的改动,包括Update, Delete和Insert.context中GetChangeSet()方法可以返回当前所有未提交的改动,而我们的目标是清空Chan ...

  4. c#执行插入sql 时,报错:异常信息:超时时间已到。在操作完成之前超时时间已过或服务器未响应

    问题:c#执行插入sql 时,报错:异常信息:超时时间已到.在操作完成之前超时时间已过或服务器未响应 解决: SqlCommand cmd = new SqlCommand(); cmd.Comman ...

  5. 使用layui框架 修改时部分参数未传给后台(查找原因)

    采用的结构: <form class="layui-form reset-form" action="" id="formData"& ...

  6. 触发器修改后保存之前的数据 表中插入数据时ID自动增长

    create or replace trigger t before update on test5 for each rowbegin insert into test55 values (:old ...

  7. SQL Server 中的事务与事务隔离级别以及如何理解脏读, 未提交读,不可重复读和幻读产生的过程和原因

    原本打算写有关 SSIS Package 中的事务控制过程的,但是发现很多基本的概念还是需要有 SQL Server 事务和事务的隔离级别做基础铺垫.所以花了点时间,把 SQL Server 数据库中 ...

  8. 检查点(Checkpoint)过程如何处理未提交的事务

    每次我讲解SQL Server之前,我都会先简单谈下当我们执行查询时,在SQL Server内部发生了什么.执行一个SELECT语句非常简单,但是执行DML语句更加复杂,因为SQL Server要修改 ...

  9. SQL Server中的事务与其隔离级别之脏读, 未提交读,不可重复读和幻读

    原本打算写有关 SSIS Package 中的事务控制过程的,但是发现很多基本的概念还是需要有 SQL Server 事务和事务的隔离级别做基础铺垫.所以花了点时间,把 SQL Server 数据库中 ...

随机推荐

  1. TCP协议滑动窗口(一)——控制大批量数据传输速率

    窗口大小:TCP头中一个16位的域,表示当前可用接受缓冲区大小.在每个TCP对等段连接初始化时,告诉对方自己的窗口大小(不一定是满额,假如满额65201字节,可能暂时通告5840字节).若客户端接受数 ...

  2. 关于在win7旗舰版32位上 安装 net4.0 的闪退问题研究 和安装sqlserver2008问题

    1.配置文件客户端[目标x86x64]的 可以安装 2.配置文件完全的目标x86x64的 出现闪退. 3.服务器核心的出现无法安装 安装 sqlserver 2008R2数据库 报错 \最后留下了它, ...

  3. Centos初始化硬盘分区、挂载

    刚刚买了一台服务器,刚买的服务器的数据盘都是需要自己来分区的,下面就记录一下操作. 通过命令fdisk-l查看硬盘信息 可以看到有两块硬盘/dev/vda和/dev/vdb,启动vda是系统盘vdb是 ...

  4. 一文详解Spring Cloud Feign重试机制

    前言 Feign组件默认使用Ribbon的重试机制并增加了根据状态码判断重试机制,默认情况下是不启用的.Feign使用的是Spring Retry组件,需要引入依赖才能启用. 一.POM引入Sprin ...

  5. Math.floor() 与 parseInt()

    parseInt()与Math.floor()都能实现数字的向下取整,但是两者存在根本上的差异,1.Math.floor()用于一个数的向下取整,不能解析字符串 <script type=&qu ...

  6. iptables详解(3):iptables规则管理

    所属分类:IPtables  Linux基础 在本博客中,从理论到实践,系统的介绍了iptables,如果你想要从头开始了解iptables,可以查看iptables文章列表,直达链接如下 iptab ...

  7. 通过JS唤醒app(安卓+ios)

    有需求说要通过页面按钮唤醒app,或者手机上没有这款app跳转到商店,然后刚开始也是查了资料的,结果发现一头雾水,不过最后还是捣鼓出来了,当然也参考了前人分享的经验,下面我就将方法整理一下: 首先明确 ...

  8. POJ 2823 Sliding Window & Luogu P1886 滑动窗口

    Sliding Window Time Limit: 12000MS   Memory Limit: 65536K Total Submissions: 66613   Accepted: 18914 ...

  9. Nginx配置文件的高亮显示设置

    linux系统下vim或者vi编辑器默认是没有对nginx的语法高亮设置. 1.下载vi语法高亮配置到 ~/.vim/syntax,如果不存在则创建该目录,cd ~/.vim/syntax wget ...

  10. JQ + PHP + TrackMore物流信息跟踪

    在使用之前,您需要先去trackmore官方网站申请API_KEY,传送门:TrackMore html <script type="text/javascript" src ...