的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 数据库中 ...
随机推荐
- [Android]异常5-throwable:java.lang.OutOfMemoryError: pthread_create
背景:线程初始化耗时任务 异常原因: 可能一>多个new Thread()嵌套 解决办法有: 解决一>使用Handler分离new Thread()嵌套 注: 06-30 09:12:26 ...
- jQuery——事件操作
事件绑定 1.简单事件绑定 $("button").click(function () {})//可重复绑定,不会被层叠 2.bind():不推荐使用 $("button ...
- JS——回调函数
1.回调函数作为参数的形式进行使用 2.回调函数一定程度上达到了解耦效果(模块化.功能化) <script> console.log(op(1, 2, add)); console.log ...
- SSH整合框架+mysql简单的实现
SSH整合框架+mysql简单的实现 1. 框架整合原理: struts2整合Spring 两种: 一种struts2自己创建Action,自动装配Service : 一种 将Action交给Spri ...
- SQL Server2008 数据库日志清理
USE [master] --运行master数据库 GO ALTER DATABASE HIS_MHYW SET RECOVERY SIMPLE WITH NO_WAIT --库 (dh_emr) ...
- Python语言之模块
模块基本上就是一个包含了所有你定义的函数和变量的文件.它用处在于使你你能在别的程序中重用它提供的功能和服务. 1.模块的使用方法 模块的文件名必须以.py作为扩展名. 当我们需要使用某个模块时,我们需 ...
- (转)分布式文件存储FastDFS(四)配置fastdfs-apache-module
http://blog.csdn.net/xingjiarong/article/details/50560605 在前边我们已经配置好了FastDFS的环境,但是此时的FastDFS还不能通过htt ...
- 让Android的WebView支持html里面的文件上传
默认情况下,Android的webview是不支持<input type=file>的,点击没有任何反应,如果希望点击上传,弹出选择文件.图片的窗口,那就需要自定义一个WebChromeC ...
- 如何从源码启动和编译IoTSharp
IoTSharp 项目是一个开源物联网平台,数据库使用PostgreSQL , 后端使用 Asp.Net Core 2.2 ,前端使用 vue-element-admin , 下面我们介绍如何启动项 ...
- 基本数据类型:布尔型(bool)和空值None
一.布尔型(bool) 布尔类型很简单,就两个值 ,一个True(真),一个False(假), 主要用记逻辑判断: 一件事情成立就是True,不成立就是False,也可以将bool值归类为数字, 是因 ...