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

说一下今天遇到的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未提交之前插入/修改时重新查询不准确问题的更多相关文章

  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. 我的liunx开发环境的配置之路

    相信有不少人和我一样,虽然是做纯linux开发,但并不排斥windows,并且喜欢在windows下面的使用各种好用的工具来让linux的编程工作变得更加方便.实际上每一个系统都有他的过人支持,win ...

  2. MyBatis入门3_mapper.xml优化(parameterType简写_NameSpace简写_sql片段_特殊字符处理)_动态SQL

    本文为博主辛苦总结,希望自己以后返回来看的时候理解更深刻,也希望可以起到帮助初学者的作用. 转载请注明 出自 : luogg的博客园 谢谢配合! 优化 1.起别名(一般不用,写全方便查看类出处) 以前 ...

  3. Object.keys() https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/keys

    Object.keys() 方法会返回一个由一个给定对象的自身可枚举属性组成的数组,数组中属性名的排列顺序和使用for...in 循环遍历该对象时返回的顺序一致 (两者的主要区别是 一个 for-in ...

  4. 汇编:MSR/MRS/BIC指令

    1.MRS指令MRS指令的格式为:MRS{条件}   通用寄存器,程序状态寄存器(CPSR或SPSR)MRS指令用于将程序状态寄存器的内容传送到通用寄存器中.该指令一般用在以下两种情冴: Ⅰ.当需要改 ...

  5. php base64互转pdf

    /* * base64转pdf */ function base642pdf($formTxt,$toPdf) { $file = file_get_contents($formTxt);//读 $d ...

  6. jquery操作元素之间相邻的元素的获取方式

    <!DOCTYPE html><html> <head> <style> .siblings * { display: block; border: 2 ...

  7. BZOJ 4032 Luogu P4112 [HEOI2015]最短不公共子串 (DP、后缀自动机)

    这其实是道水题... 题目链接: (bzoj)https://www.lydsy.com/JudgeOnline/problem.php?id=4032 (luogu)https://www.luog ...

  8. Spring+SpringMVC+MyBatis整合教程

    1.基本概念 1.1.Spring Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One  ...

  9. 清北学堂模拟赛d6t1 角谷猜想

    分析:不用删数字,我们考虑加入数字,维护一个栈,把不是4和7的数加进去,遇到3看栈顶是不是1,是的话弹出来就可以了. #include <bits/stdc++.h> #define N ...

  10. [cf 599C] Day at the Beach

    题意:有n个数,将其分组使整个数列排序后每组中的数仍在该组中,求最多的分组数. 代码很易懂 #include <iostream> #include <algorithm> # ...