的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 数据库中 ...
随机推荐
- 我的liunx开发环境的配置之路
相信有不少人和我一样,虽然是做纯linux开发,但并不排斥windows,并且喜欢在windows下面的使用各种好用的工具来让linux的编程工作变得更加方便.实际上每一个系统都有他的过人支持,win ...
- MyBatis入门3_mapper.xml优化(parameterType简写_NameSpace简写_sql片段_特殊字符处理)_动态SQL
本文为博主辛苦总结,希望自己以后返回来看的时候理解更深刻,也希望可以起到帮助初学者的作用. 转载请注明 出自 : luogg的博客园 谢谢配合! 优化 1.起别名(一般不用,写全方便查看类出处) 以前 ...
- Object.keys() https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/keys
Object.keys() 方法会返回一个由一个给定对象的自身可枚举属性组成的数组,数组中属性名的排列顺序和使用for...in 循环遍历该对象时返回的顺序一致 (两者的主要区别是 一个 for-in ...
- 汇编:MSR/MRS/BIC指令
1.MRS指令MRS指令的格式为:MRS{条件} 通用寄存器,程序状态寄存器(CPSR或SPSR)MRS指令用于将程序状态寄存器的内容传送到通用寄存器中.该指令一般用在以下两种情冴: Ⅰ.当需要改 ...
- php base64互转pdf
/* * base64转pdf */ function base642pdf($formTxt,$toPdf) { $file = file_get_contents($formTxt);//读 $d ...
- jquery操作元素之间相邻的元素的获取方式
<!DOCTYPE html><html> <head> <style> .siblings * { display: block; border: 2 ...
- BZOJ 4032 Luogu P4112 [HEOI2015]最短不公共子串 (DP、后缀自动机)
这其实是道水题... 题目链接: (bzoj)https://www.lydsy.com/JudgeOnline/problem.php?id=4032 (luogu)https://www.luog ...
- Spring+SpringMVC+MyBatis整合教程
1.基本概念 1.1.Spring Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One ...
- 清北学堂模拟赛d6t1 角谷猜想
分析:不用删数字,我们考虑加入数字,维护一个栈,把不是4和7的数加进去,遇到3看栈顶是不是1,是的话弹出来就可以了. #include <bits/stdc++.h> #define N ...
- [cf 599C] Day at the Beach
题意:有n个数,将其分组使整个数列排序后每组中的数仍在该组中,求最多的分组数. 代码很易懂 #include <iostream> #include <algorithm> # ...