在OQL上使用UPDLOCK锁定查询结果,安全的更新实体数据
有时候我需要控制某条记录在我读取后就不许再进行更新,那么我就可以将所有要处理当前记录的查询都加上更新锁,以防止查询后被其它事务修改.将事务的影响降低到最小。假如不这样做,将整个表锁定,这种做法将严重影响了性能。
begin tran
select * from address WITH (UPDLOCK) where [Name]='Z'
waitfor delay '00:00:10'
update address set [Name]='X' where [Name]='Z'
commit tran
上面这个例子可能比较抽象,让我们来举一个实际的例子。
假设有一个投资产品表,当我们查询到该产品记录后,要进行一系列的判断,最后对该记录进行更新。该记录的状态会影响到下一个人查询到此记录的处理。下面我们来看看用SOD框架的OQL怎么处理。
decimal sumAmount = model.Amount + model.GvMoney;
DateTime currentTime = DateTime.Now;
AdoHelper db = AdoHelper.CreateHelper("defaultDB"); db.BeginTransaction();
try
{
//查询相关产品余额剩多少够不够买的
var pro = EntityQuery<Pro_Products>.QueryObject(
OQL.From<Pro_Products>()
.With(OQL.SqlServerLock.UPDLOCK)
.Select()
.Where<Pro_Products>((cmp, p) => cmp.Property(p.proNumber) == model.ProNumber)
.END, db);
if (pro == null)
{
db.Rollback();
return new OrderingModel { Msg = "剩余可投金额不足" };
}
//2015 08 06 打开原有注释,限制投资金额
if (sumAmount < || sumAmount % != )
{
db.Rollback();
return new OrderingModel { Msg = "投标金额不正确" };
} //线下标下单时,不可使用现金券
if (SetObject.IsOffline(pro.ProType))
{
sumAmount = model.Amount;
}
if (pro.Surplus < sumAmount)
{
db.Rollback();
return new OrderingModel { Msg = "剩余可投金额不足" };
}
if (currentTime < pro.starttime)
{
db.Rollback();
return new OrderingModel { Msg = "还未开始" };
}
var giveAward = ;
if (pro.Surplus == sumAmount)
{
if (sumAmount >= && sumAmount < )
{
giveAward = ;
}
if (sumAmount >= )
{
giveAward = ;
}
}
//扣除产品可用金额
pro.Surplus -= sumAmount;
if (pro.Surplus == )//最后一笔 更新满标状态
{
pro.Prostatus = "";
//pro.Paymentime = currentTime.AddDays(1);
pro.Paymentime = currentTime;
//
pro.ProOrder = ;
} EntityQuery<Pro_Products>.Instance.Update(pro, db); //其它复杂的处理逻辑,更新其它表的操作,略... db.Commit();
上面的操作,首先在AdoHelper对象上开启事务,然后查询投资产品实体的时候在With方法上加上 OQL.SqlServerLock.UPDLOCK 更新锁,接着进行复制的业务处理,然后更新此实体记录,之后还有复杂的其它业务操作,最后提交事务。
我们看到,OQL的这种更新锁操作,跟直接写SQL语句操作很类似,OQL执行的时候也是这样输出SQL语句的,这样确保数据记录在并发的时候,安全的更新。
注意:OQL更新锁目前只支持SqlServer数据库。
在OQL上使用UPDLOCK锁定查询结果,安全的更新实体数据的更多相关文章
- hive(在大数据集合上的类SQL查询和表)学习
1.jdbc:mysql://localhost:3306/hive?createDatabaseIfNotExist=true&characterEncoding=UTF-8&use ...
- DBA查询命令积累——不断更新
原文:DBA查询命令积累--不断更新 一.服务器配置: 1.兼容级别:兼容级别只影响指定数据库中的行为,而不会影响整个服务器上的行为. 1.1.查看数据库兼容级别及更改兼容级别: SELECT com ...
- 使用TSQL查询和更新 JSON 数据
JSON是一个非常流行的,用于数据交换的文本数据(textual data)格式,主要用于Web和移动应用程序中.JSON 使用“键/值对”(Key:Value pair)存储数据,能够表示嵌套键值对 ...
- 结合bootstrap fileinput插件和Bootstrap-table表格插件,实现文件上传、预览、提交的导入Excel数据操作流程
1.bootstrap-fileinpu的简单介绍 在前面的随笔,我介绍了Bootstrap-table表格插件的具体项目应用过程,本篇随笔介绍另外一个Bootstrap FieInput插件的使用, ...
- 使用DB查询分析器实现异构数据源中数据表的相互访问
1 引言 硕士程序员马根峰(CSDN专访马根峰:海量数据处理与分析大师的中国本土程序员)推出的个人作品----万能数据库查询分析器,中文版本DB 查询分析器.英文版本<DB Query A ...
- mybatis查询语句的背后之封装数据
转载请注明出处... 一.前言 继上一篇mybatis查询语句的背后,这一篇主要围绕着mybatis查询的后期操作,即跟数据库交互的时候.由于本人也是一边学习源码一边记录,内容难免有错误或不足之处,还 ...
- 数据在千万级别上进行全文检索有哪些技术?强大的大数据全文索引解决方案-ClouderaSearch
数据在千万级别上进行全文检索有哪些技术?强大的大数据全文索引解决方案-ClouderaSearch1.lucene (solr, elasticsearch 都是基于它) 2.sphinx3.elas ...
- EF Core 中多次从数据库查询实体数据,DbContext跟踪实体的情况
使用EF Core时,如果多次从数据库中查询一个表的同一行数据,DbContext中跟踪(track)的实体到底有几个呢?我们下面就分情况讨论下. 数据库 首先我们的数据库中有一个Person表,其建 ...
- elasticsearch查询篇索引映射文档数据准备
elasticsearch查询篇索引映射文档数据准备 我们后面要讲elasticsearch查询,先来准备下索引,映射以及文档: 我们先用Head插件建立索引film,然后建立映射 POST http ...
随机推荐
- 微信小程序开发资料
微信开放平台:主要面向App开发者.通常是拥有成熟的应用程序后,通过开放平台将内容分享到朋友圈或发送给某个微信好友/群.例如QQ音乐分享,美图秀秀修改过的照片直接发朋友圈或聊天. 微信公众平台:强 ...
- 【安富莱二代示波器教程】第19章 附件E---参考资料
第19章 附件E---参考资料 DSP教程 http://forum.armfly.com/forum.php?mod=viewthread&tid=3886 . FreeRTOS教 ...
- Redis两种方式实现限流
案例-实现访问频率限制: 实现访问者 $ip 在一定的时间 $time 内只能访问 $limit 次. 非脚本实现 private boolean accessLimit(String ip, int ...
- Android 音视频开发(四):使用 Camera API 采集视频数据
本文主要将的是:使用 Camera API 采集视频数据并保存到文件,分别使用 SurfaceView.TextureView 来预览 Camera 数据,取到 NV21 的数据回调. 注: 需要权限 ...
- [Swift]LeetCode330. 按要求补齐数组 | Patching Array
Given a sorted positive integer array nums and an integer n, add/patch elements to the array such th ...
- [Swift]LeetCode419. 甲板上的战舰 | Battleships in a Board
Given an 2D board, count how many battleships are in it. The battleships are represented with 'X's, ...
- [Swift]LeetCode829. 连续整数求和 | Consecutive Numbers Sum
Given a positive integer N, how many ways can we write it as a sum of consecutive positive integers? ...
- Python基础语法(三)
Python基础语法(三) 1. 数值型数据结构 1.1 要点 在之前的博客也有提到,数值型数据结构在这里就不过多介绍了.在这里提及一些需要知道的知识点. int.float.complex.bool ...
- PyCharm2019 激活码
因公司的需求,需要做一个爬取最近上映的电影.列车号.航班号.机场.车站等信息,所以需要我做一个爬虫项目,当然java也可以做爬虫,但是还是没有python这样方便,所以也开始学习Python啦!!! ...
- 9.Flask Cookie和Session
1.1.概念 cookie:在网站中,http请求是无状态的.也就是说即使第一次和服务器连接后并且登录成功后,第二次请求服务器依然不能知道当前请求是哪个用户.cookie的出现就是为了解决这个问题,第 ...