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

说一下今天遇到的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. [Android]异常5-throwable:java.lang.OutOfMemoryError: pthread_create

    背景:线程初始化耗时任务 异常原因: 可能一>多个new Thread()嵌套 解决办法有: 解决一>使用Handler分离new Thread()嵌套 注: 06-30 09:12:26 ...

  2. jQuery——事件操作

    事件绑定 1.简单事件绑定 $("button").click(function () {})//可重复绑定,不会被层叠 2.bind():不推荐使用 $("button ...

  3. JS——回调函数

    1.回调函数作为参数的形式进行使用 2.回调函数一定程度上达到了解耦效果(模块化.功能化) <script> console.log(op(1, 2, add)); console.log ...

  4. SSH整合框架+mysql简单的实现

    SSH整合框架+mysql简单的实现 1. 框架整合原理: struts2整合Spring 两种: 一种struts2自己创建Action,自动装配Service : 一种 将Action交给Spri ...

  5. SQL Server2008 数据库日志清理

    USE [master] --运行master数据库 GO ALTER DATABASE HIS_MHYW SET RECOVERY SIMPLE WITH NO_WAIT --库 (dh_emr) ...

  6. Python语言之模块

    模块基本上就是一个包含了所有你定义的函数和变量的文件.它用处在于使你你能在别的程序中重用它提供的功能和服务. 1.模块的使用方法 模块的文件名必须以.py作为扩展名. 当我们需要使用某个模块时,我们需 ...

  7. (转)分布式文件存储FastDFS(四)配置fastdfs-apache-module

    http://blog.csdn.net/xingjiarong/article/details/50560605 在前边我们已经配置好了FastDFS的环境,但是此时的FastDFS还不能通过htt ...

  8. 让Android的WebView支持html里面的文件上传

    默认情况下,Android的webview是不支持<input type=file>的,点击没有任何反应,如果希望点击上传,弹出选择文件.图片的窗口,那就需要自定义一个WebChromeC ...

  9. 如何从源码启动和编译IoTSharp

    IoTSharp 项目是一个开源物联网平台,数据库使用PostgreSQL , 后端使用 Asp.Net Core 2.2 ,前端使用  vue-element-admin , 下面我们介绍如何启动项 ...

  10. 基本数据类型:布尔型(bool)和空值None

    一.布尔型(bool) 布尔类型很简单,就两个值 ,一个True(真),一个False(假), 主要用记逻辑判断: 一件事情成立就是True,不成立就是False,也可以将bool值归类为数字, 是因 ...