存储过程调用过快时数据无法正确处理问题

ccssddnnsb 2013-12-04 04:39:09
mssql2000
我有个存储过程,供多个数据处理程序调用,现在出现有一个问题,即数据无法正常处理

1、将字符串分解为可插入的数据,将数据放入数据库中
INSERT INTO temp1(id,f1,f2,f)VALUES('abc','1','2','true')
2、查询数据中同类型数据,将原有数据过期掉,保证新数据为最新可用。
update temp1 set f='false' where id<>'abc' and f1='1'

如果调用端少时程序正常,但当调用端很多而且更新很快时,问题就来了,插入的数据还是f1 明明是 '1' 但到2步时,它极有可能变为后面一次传值调用的 '5’了。
...全文
235 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
LongRui888 2013-12-04
  • 打赏
  • 举报
回复
引用 12 楼 ccssddnnsb 的回复:
[quote=引用 11 楼 DBA_Huangzj 的回复:] 但是高并发的情况下,你这样“排他”就等于串行,我这里的隔离级别是乐观并发,相对而言比较好
1、用的是2000 SET ALLOW_SNAPSHOT_ISOLATION ON 未找到 2、想了解出这个问题原因。[/quote] 你的是2000是吧,那就不能用这个了SET ALLOW_SNAPSHOT_ISOLATION ON ,这个是2005以后才有的
發糞塗牆 2013-12-04
  • 打赏
  • 举报
回复
2000没有乐观并发。你这个原因我看是不可重复读的问题,也就是你7楼估计的那个情况。因为insert 过程中,你这种insert不会锁住前面的数据,所以insert可以随意执行,但是update的时候就要锁住where条件中用到的那些数据,所以我觉得再update前先判断比较合理。
ccssddnnsb 2013-12-04
  • 打赏
  • 举报
回复
引用 11 楼 DBA_Huangzj 的回复:
但是高并发的情况下,你这样“排他”就等于串行,我这里的隔离级别是乐观并发,相对而言比较好
1、用的是2000 SET ALLOW_SNAPSHOT_ISOLATION ON 未找到 2、想了解出这个问题原因。
發糞塗牆 2013-12-04
  • 打赏
  • 举报
回复
但是高并发的情况下,你这样“排他”就等于串行,我这里的隔离级别是乐观并发,相对而言比较好
ccssddnnsb 2013-12-04
  • 打赏
  • 举报
回复
引用 9 楼 DBA_Huangzj 的回复:
方法一,提高隔离级别:ALTER DATABASE AdventureWorks2008R2 SET ALLOW_SNAPSHOT_ISOLATION ON;这个会导致tempdb增大 方法二,在update之前先用if来判断数据,避免你7楼说的情况
我感觉需要用对存储过程进行排它调用的控制这个问题才能解决,而隔离级别多指数据库数据处理。
發糞塗牆 2013-12-04
  • 打赏
  • 举报
回复
方法一,提高隔离级别:ALTER DATABASE AdventureWorks2008R2 SET ALLOW_SNAPSHOT_ISOLATION ON;这个会导致tempdb增大 方法二,在update之前先用if来判断数据,避免你7楼说的情况
ccssddnnsb 2013-12-04
  • 打赏
  • 举报
回复
引用 6 楼 DBA_Huangzj 的回复:
事务隔离级别没改过吧?另外你说你是mssql2000,2000没有 XACT_ABORT的哦
我用的默认没有变动过,我后面说了一下,这里不是插入数据的问题,而是变量在执行过程中发生了变化。
ccssddnnsb 2013-12-04
  • 打赏
  • 举报
回复
由于这个存储过程一般由N个程序并发调用,感觉就是第一个分解出来字符刚加入完数据后,第二个就加入来了,所以在第二步就造成判断条件并不是第一次数据,而变成第二次数据了,难道事务对变量无效,同一个调用时会侵入上次未执行完调用。
發糞塗牆 2013-12-04
  • 打赏
  • 举报
回复
事务隔离级别没改过吧?另外你说你是mssql2000,2000没有 XACT_ABORT的哦
ccssddnnsb 2013-12-04
  • 打赏
  • 举报
回复
引用 4 楼 DBA_Huangzj 的回复:
你是都包在一个事务中还是分开多个事务?另外你的update语句是不是应该还要加上f<>'false'啊?
f<>'false' 是加了的,是一个事务中处理的。
發糞塗牆 2013-12-04
  • 打赏
  • 举报
回复
你是都包在一个事务中还是分开多个事务?另外你的update语句是不是应该还要加上f<>'false'啊?
ccssddnnsb 2013-12-04
  • 打赏
  • 举报
回复
引用 2 楼 DBA_Huangzj 的回复:
事务没控制好
下面是代码事务 AS SET XACT_ABORT ON --强制出错全部回滚 BEGIN TRAN ----代码内容 IF @@ERROR<>0 GOTO errhandle COMMIT TRAN RETURN errhandle: IF @@ERROR<>0 BEGIN ROLLBACK TRAN END
發糞塗牆 2013-12-04
  • 打赏
  • 举报
回复
事务没控制好
ccssddnnsb 2013-12-04
  • 打赏
  • 举报
回复
感觉像是内存出现问题溢出一样,但数据加入仍比较正常,只是数据不对了,常将正确数据过期掉
PowerBI系列之Power Query专题1.  获取数据 数据源种类介绍和获取Excel数据源输入数据和拷贝数据:创建辅助表解析Json/XML数据格式获取Web网页数据和URL添加动态参数连接数据的四种模式:Import、DirectQuery、Live Connection、Dual双 属于混合模式连接数据库:Sql server、 Mysql(直连但是必须先安装一个mysql插件)DirectQuery直连查询:Sql serverODBC方式获取数据表关联或多个Sql或调用存储过程获取数据SQL中动态传参和自定义函数: sql中使用参数或数据库名称使用参数连接Sharepoint和OneDrive数据源连接Dataset和Dataflow 替换本地数据源为Sharepoint数据源并保留数据处理操作 终止当前数据刷新Loading:Cancel Query数据源设置-重置数据连接凭证PBIDS连接数据源创建和使用报表模块(输入或值列表)利用报表模板和参数控制线下报表数据权限DirectQuery启用自动页面刷新和更改检测管理聚合表提高DirectQuery查询性能动态M查询参数提高DirectQuery查询性能添加数据刷新间 DateTime.LocalNow()和Getdate()2.  数据清洗和M语言M语言和官方文档介绍PowerQuery中查阅M函数:=#shared, Ctrl+Space提示数据清洗之常用技能:提升标题、更改数据类型、保留删除错误或空行,删除重复项、选择列和删除列、填充单元格、合并列、拆分、提取、替换、条件替换、添加自定义列,添加条件列、添加索引列、分组、添加年月日列、追加和合并查询透视和逆透视以及转置合并单元格的Excel文件处理导入文件夹中多Excel文件并合并解决多文件合并中列顺序不一致使用参数和函数批量导入文件 文本中提取中文、英文、数字等处理双引号转义 列拆分详解解决列名改变错误解决列丢失错误动态显示、排序和重命名列为所有列名添加前缀列名字母大写和分隔符调整Trim标题列中的多余空格如何处理load数据错误为什么load的Excel数据有null空行为什么load的Excel数据标题在第二行灵活添加占位符规范同类相似数据数据按多列排序为分组添加Index序号分组内值合并诊断工具分析数据处理过程PowerQuery小技巧分享 新冠病例活动轨迹地图标识 

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧