sqlserver 并发查询,数据统一性的问题

mamamiya5613 2013-07-03 11:31:17
请教给位高手:
计算某一个值的时候需要同时从四张表取数,但是这四张表实时在更新,每个客户更新这四张表的顺序都是一致的,如何确保在计算这个值的时候,四张表的数据是最新的(就是规避该客户只更新了其中两张表就开始统计数据了)?
...全文
217 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
SQL77 2013-07-03
  • 打赏
  • 举报
回复
引用 6 楼 mamamiya5613 的回复:
[quote=引用 4 楼 SQL77 的回复:] begin trans update 表一; update 表二; update 表三; update 表四 查询语句. commit trans
不能这么做,因为查询客户的数据其实是一个监控程序,是个定时任务,且这几张表有五个线程在同时操作,只是表的操作顺序都是一样的。[/quote] 额.这样的,那你计算的东西如果参考了表的最新的值的话,如果正在更新.你是查不到的.在默认隔离级别下.
mamamiya5613 2013-07-03
  • 打赏
  • 举报
回复
引用 4 楼 SQL77 的回复:
begin trans update 表一; update 表二; update 表三; update 表四 查询语句. commit trans
不能这么做,因为查询客户的数据其实是一个监控程序,是个定时任务,且这几张表有五个线程在同时操作,只是表的操作顺序都是一样的。
mamamiya5613 2013-07-03
  • 打赏
  • 举报
回复
引用 3 楼 fancylee 的回复:
性能上较好的方法是,在更新上加事务,同时将数据库设置为快照隔离; begin trans update 表一; update 表二; update 表三; update 表四; commit trans
更新中本来就有如同上述的事务控制,但是我在测试的时候还是会发生客户数据异常,明显就是可以表一表二更新了 但是变三表四没有被更新的时候进行了数据统计的结果
SQL77 2013-07-03
  • 打赏
  • 举报
回复
begin trans update 表一; update 表二; update 表三; update 表四 查询语句. commit trans
SarahCla 2013-07-03
  • 打赏
  • 举报
回复
性能上较好的方法是,在更新上加事务,同时将数据库设置为快照隔离; begin trans update 表一; update 表二; update 表三; update 表四; commit trans
mamamiya5613 2013-07-03
  • 打赏
  • 举报
回复
引用 1 楼 lzw_0736 的回复:
查詢時,四張表加共享鎖.
具体如何操作呢?我有点不理解。
lzw_0736 2013-07-03
  • 打赏
  • 举报
回复
查詢時,四張表加共享鎖.
dw_chaoyue 2013-07-03
  • 打赏
  • 举报
回复
引用
有可能出现这种情况: 读表1,读表2,事物更新表1、2、3、4,读表3、读表4,计算统计数据,那么这样就会出错了。 如果想保证读一致,那就得保证读得过程中不能更新,可以考虑在读过程中加更新锁,以阻止在读过程中进行更新。 begin tran select x1 from tb1 with(updlock) select x2 from tb2 with(updlock) select x3 from tb3 with(updlock) select x4 from tb4 with(updlock) set Y=x1+x2+x3+x4 commit
正解 
dw_chaoyue 2013-07-03
  • 打赏
  • 举报
回复
引用
mamamiya5613
版本啊 ,能不能把意思说明白点啊a,什么是 ”,如何确保在计算这个值的时候,四张表的数据是最新的“
Johnson 2013-07-03
  • 打赏
  • 举报
回复
有可能出现这种情况: 读表1,读表2,事物更新表1、2、3、4,读表3、读表4,计算统计数据,那么这样就会出错了。 如果想保证读一致,那就得保证读得过程中不能更新,可以考虑在读过程中加更新锁,以阻止在读过程中进行更新。 begin tran select x1 from tb1 with(updlock) select x2 from tb2 with(updlock) select x3 from tb3 with(updlock) select x4 from tb4 with(updlock) set Y=x1+x2+x3+x4 commit
Johnson 2013-07-03
  • 打赏
  • 举报
回复
有可能出现这种情况: 读表1,读表2,事物更新表1、2、3、4,读表3、读表4,计算统计数据,那么这样就会出错了。 如果想保证读一致,那就得保证读得过程中不能更新,可以考虑在读过程中加更新锁,以阻止在读过程中进行更新。 begin tran select x1 from tb1 with(uplock) select x2 from tb2 with(uplock) select x3 from tb3 with(uplock) select x4 from tb4 with(uplock) set Y=x1+x2+x3+x4 commit
lzw_0736 2013-07-03
  • 打赏
  • 举报
回复
謝謝fancylee!
SarahCla 2013-07-03
  • 打赏
  • 举报
回复
DBCC Useroptions 就可以看
SarahCla 2013-07-03
  • 打赏
  • 举报
回复
设置成已提交读。
mamamiya5613 2013-07-03
  • 打赏
  • 举报
回复
引用 8 楼 fancylee 的回复:
[quote=引用 5 楼 mamamiya5613 的回复:] [quote=引用 3 楼 fancylee 的回复:] 性能上较好的方法是,在更新上加事务,同时将数据库设置为快照隔离; begin trans update 表一; update 表二; update 表三; update 表四; commit trans
更新中本来就有如同上述的事务控制,但是我在测试的时候还是会发生客户数据异常,明显就是可以表一表二更新了 但是变三表四没有被更新的时候进行了数据统计的结果[/quote] 这个和你的隔离级别有关系,先设置快照隔离,再测试吧:) ALTER DATABASE 数据库名 SET ALLOW_SNAPSHOT_ISOLATION ON ALTER DATABASE 数据库名 SET READ_COMMITTED_SNAPSHOT ON [/quote] 悲剧,快照隔离只有在2005版本以后才有的,我的是mssql 2000,哭死!!!
唐诗三百首 2013-07-03
  • 打赏
  • 举报
回复
客户端程序按3楼的方法写, 监控程序端,在默认事务隔离等级(read committed)下,是会等待客户端执行完毕才能执行统计的.
lzw_0736 2013-07-03
  • 打赏
  • 举报
回复
引用 8 楼 fancylee 的回复:
[quote=引用 5 楼 mamamiya5613 的回复:] [quote=引用 3 楼 fancylee 的回复:] 性能上较好的方法是,在更新上加事务,同时将数据库设置为快照隔离; begin trans update 表一; update 表二; update 表三; update 表四; commit trans
更新中本来就有如同上述的事务控制,但是我在测试的时候还是会发生客户数据异常,明显就是可以表一表二更新了 但是变三表四没有被更新的时候进行了数据统计的结果[/quote] 这个和你的隔离级别有关系,先设置快照隔离,再测试吧:) ALTER DATABASE 数据库名 SET ALLOW_SNAPSHOT_ISOLATION ON ALTER DATABASE 数据库名 SET READ_COMMITTED_SNAPSHOT ON [/quote] 怎樣查詢数据库名的隔离级别?
SarahCla 2013-07-03
  • 打赏
  • 举报
回复
引用 5 楼 mamamiya5613 的回复:
[quote=引用 3 楼 fancylee 的回复:] 性能上较好的方法是,在更新上加事务,同时将数据库设置为快照隔离; begin trans update 表一; update 表二; update 表三; update 表四; commit trans
更新中本来就有如同上述的事务控制,但是我在测试的时候还是会发生客户数据异常,明显就是可以表一表二更新了 但是变三表四没有被更新的时候进行了数据统计的结果[/quote] 这个和你的隔离级别有关系,先设置快照隔离,再测试吧:) ALTER DATABASE 数据库名 SET ALLOW_SNAPSHOT_ISOLATION ON ALTER DATABASE 数据库名 SET READ_COMMITTED_SNAPSHOT ON

22,206

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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