今天因为并发的问题,又讨论了一遍。之前以为同时两个线程开启,线程A加了更新锁,线程B没有加,线程A更新后,线程B也会继续下去代码。但是今天测试了一下,原来线程A更新后(解锁),线程B将不会继续,会出现数据库语句出现修改之类的提示。

写法 SELECT * FROM TABLE WITH UPDLOCK WHERE ID=1

A代码段示例:

 using (TransactionScope trans = new TransactionScope())
{
using (var dbContext = new Qxun.Activity.DAL.ActivityDbContext())
{
string sqlStr = string.Format("SELECT * FROM TABLE WITH(UPDLOCK) WHERE ID={0} ", crossDomainPayRecord.ID);
VIPWeRegister046Play model = dbContext.Database.SqlQuery<VIPWeRegister046Play>(sqlStr).FirstOrDefault(); if (Status == 0)//说明出现问题
{
model.Status = Status;
dbContext.Update<TABLE>(model);
trans.Complete();
return Content(res.ToXml());
}
                trans.Complete();
                }
}

B代码段示例 :

using (ActivityDbContext dbContext=new ActivityDbContext())
{
List<TABLE> model= dbContext.TABLE.ToList();
foreach (var item in model)
{
item.Status= 2;
            dbContext.Insert<Table>(new Table());
dbContext.Update<TABLE>(item);
}
List<Share> share = dbContext.Shares.ToList();
if (share.Count == 0)
{
dbContext.Insert<Share>(new Share());
}
share = dbContext.Shares.ToList();
foreach (var item in share)
{
item.MerchantWeixinUserID = 1;
dbContext.Update<Share>(item);
}
}

1.线程A进入更新锁代码段,线程B将会停止在dbContext.Update处,不会再继续下去(解锁操作两种:1.更新操作(非事务处理);2.事务处理结束(处于事务))

接下来有三种情况:

1.1线程A不进行更新操作(没有update操作,即使没有改变值),线程A结束事务后(解锁),线程B将继续运行

1.2线程A进行了更新操作,即此时Status状态值更改为0,线程B将会跳转入异常,异常详细上会有数据库信息更改之类的提示

1.3线程A一直停留在断点,不进行解锁操作,时间一旦达到限制,则线程B将会提示请求超时之类的(由于数据库请求是有设定时限的)

2.线程A未进入更新锁代码段,则线程B按照正常运行

3.线程A进入更新锁代码段时,线程B也可以使用select获取,即List<TABLE> model= dbContext.TABLE.ToList();这句会被执行的,直到update操作停止

4.一旦A线程进入更新锁代码,且进行了update操作,线程B中的插入更新dbContext.Insert<Table>(new Table()); dbContext.Update<TABLE>(item);这两句都不能执行,会出现报错。而share表相关的insert和update也不能运行,这是因为share的代码处理在TABLE下面,此时dbContext已是异常状态。如果将share放置到TABLE代码上方,则会正常运行或者是将share重新开启一个dbContext2进行操作。不过其中应该还有一些缘由...

5.一旦A线程进入更新锁代码,且未进行update操作,线程B中的插入dbContext.Insert<Table>(new Table());代码是会被执行的,且share相关的代码都会被执行。

异常提示:存储区更新、插入或删除语句影响到了意外的行数(0)。实体在加载后可能被修改或删除。刷新 ObjectStateManager 项。

数据库更新锁WITH UPDLOCK的更多相关文章

  1. SqlServer中的更新锁(UPDLOCK和READPAST)

    UPDLOCK和READPAST,通过UPDLOCK和READPAST的结合我们能够解决许多问题,比如我当前项目中对于更新预约人数,则用到了UPDLOCK和READPAST,因为考虑到并发如果固定预约 ...

  2. SqlServer中的更新锁(UPDLOCK)

    UPDLOCK.UPDLOCK 的优点是允许您读取数据(不阻塞其它事务)并在以后更新数据,同时确保自从上次读取数据后数据没有被更改.当我们用UPDLOCK来读取记录时可以对取到的记录加上更新锁,从而加 ...

  3. 【SqlServer】SqlServer中的更新锁(UPDLOCK)

    UPDLOCK.UPDLOCK 的优点是允许您读取数据(不阻塞其它事务)并在以后更新数据,同时确保自从上次读取数据后数据没有被更改.当我们用UPDLOCK来读取记录时可以对取到的记录加上更新锁,从而加 ...

  4. 使用Sqlserver更新锁防止数据脏读

    有时候我们需要控制某条记录在程序读取后就不再进行更新,直到事务执行完释放后才可以.这时候我们就可以将所有要操作当前记录的查询加上更新锁,以防止查询后被其它事务修改.这种操作只锁定表中某行而不会锁定整个 ...

  5. 【转】MSSQLServer数据库事务锁机制分析

    锁是网络数据库中的一个非常重要的概念,它主要用于多用户环境下保证数据库完整性和一致性.各种大型数据库所采用的锁的基本理论是一致的,但在具体实现上各有差别.目前,大多数数据库管理系统都或多或少具有自我调 ...

  6. SQLServer之数据库行锁

    行锁使用注意事项 1.ROWLOCK行级锁确保在用户取得被更新的行,到该行进行更新,这段时间内不被其它用户所修改.因而行级锁即可保证数据的一致性,又能提高数据操作的并发性. 2.ROWLOCK告诉SQ ...

  7. Oracle数据库的锁类型

    Oracle数据库的锁类型 博客分类: oracle   Oracle数据库的锁类型 根据保护的对象不同,Oracle数据库锁可以分为以下几大类:DML锁(data   locks,数据锁),用于保护 ...

  8. c#数据库事务锁类型

    一.脏读.不可重复读.幻象读的区别   1.脏读:包含未提交数据的读取.例如,事务 a 更改了某行(数据库已发生更改,但尚未提交,有可能发生回滚),事务 b 在事务 a 提交更改之前读取已更改的行.如 ...

  9. 数据库乐观锁和悲观锁的理解和实现(转载&总结)

    数据的锁定分为两种,第一种叫作悲观锁,第二种叫作乐观锁. 1.悲观锁,就是对数据的冲突采取一种悲观的态度,也就是说假设数据肯定会冲突,所以在数据开始读取的时候就把数据锁定住.[数据锁定:数据将暂时不会 ...

随机推荐

  1. openstack之~glance安装部署

    接着部署完keystone后,接着部署glance 第一:部署安装glance glance关于数据库的操作: [root@controller /]# mysql -u root -p Enter ...

  2. poj3617 Best Cow Line(贪心,字典序问题)

    https://vjudge.net/problem/POJ-3617 这类字符串处理字典序问题经常用到贪心, 每决定输出一个字符之前,都要前后i++,j--逐个比大小,直至比出为止. #includ ...

  3. seq_file学习(1)—— single_open

    span::selection, .CodeMirror-line > span > span::selection { background: #d7d4f0; }.CodeMirror ...

  4. 简易RPC框架-SPI

    *:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...

  5. 04、常用RDD操作整理

    常用Transformation 注:某些函数只有PairRDD只有,而普通的RDD则没有,比如gropuByKey.reduceByKey.sortByKey.join.cogroup等函数要根据K ...

  6. openssl链接动态库的方法

    错误:AES_set_decrypt_key 一. 编译时: 1. 不要在windows与linux共享区编译2. ./config no-asm -fPIC3. make 二. cp: cannot ...

  7. Java+Selenium3框架设计篇5-如何实现邮件发送测试报告

    https://blog.csdn.net/u011541946/article/details/77278837 本篇继续回答网友的问题,这个主题是如何通过邮件发送测试报告.通过邮件发送测试报告,这 ...

  8. C# 之 批量插入数据到 SQLServer 中

    创建一个用来测试的数据库和表,为了让插入数据更快,表中主键采用的是GUID,表中没有创建任何索引.GUID必然是比自增长要快.而如果存在索引的情况下,每次插入记录都会进行索引重建,这是非常耗性能的.如 ...

  9. &lt;climits&gt;头文件定义的符号常量

    <climits>头文件定义的符号常量 CHAR_MIN  char的最小值 SCHAR_MAX  signed char 最大值 SCHAR_MIN   signed char 最小值 ...

  10. Java之Servlet

    Servlet规范了JavaWeb项目的结构Servlet的规范约束了服务器如何来实现Servlet规范,如何解析JavaWeb项目的结构. Java就是通过接口来约束 Servlet规范的jar就在 ...