加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

SQL Server竞争前提题目

发布时间:2021-03-07 06:19:46 所属栏目:编程 来源:网络整理
导读:(留意:这合用于MS SQL Server) 假设您有一个带有主键标识列和CODE列的表ABC.我们但愿这里的每一行都有一个奇异的,次序天生的代码(基于一些典范的校验位公式). 假设您有另一个表DEF只有一行,它存储下一个可用的CODE(想象一个简朴的自动编号). 我知道下面的逻

(留意:这合用于MS SQL Server)

假设您有一个带有主键标识列和CODE列的表ABC.我们但愿这里的每一行都有一个奇异的,次序天生的代码(基于一些典范的校验位公式).

假设您有另一个表DEF只有一行,它存储下一个可用的CODE(想象一个简朴的自动编号).

我知道下面的逻辑会呈现竞争前提,个中两个用户最终也许会行使沟通的代码:

1) Run a select query to grab next available code from DEF
2) Insert said code into table ABC
3) Increment the value in DEF so it's not re-used.

我知道,两个用户也许会陷入第1步),最终也许会在ABC表中找到沟通的CODE.

处理赏罚这种环境的最佳要领是什么?我觉得我可以环绕这个逻辑包装一个“begin tran”/“commit tran”,但我以为这不起浸染.我有一个这样的存储进程来测试,可是当我从MS中的两个差异的窗口运行时,我没有停止竞争前提:

begin tran

declare @x int

select   @x= nextcode FROM  def

waitfor delay '00:00:15'

update def set nextcode = nextcode + 1

select @x

commit tran

有人可以对此有所相识吗?我以为该事宜会阻止其他用户在第一个事宜完成之前可以或许会见我的NextCodeTable,但我想我对事宜的领略是有缺陷的.

编辑:我实行将守候移到“更新”声明后,我有两个差异的代码…但我猜疑.我在哪里有waitfor声明来模仿耽误,因此可以很轻易地看到竞争前提.我以为要害题目是我对买卖营业怎样运作的错误熟悉.

办理要领

将事宜断绝级别配置为Serializable.
在较低的断绝级别,其他事宜可以读取此事宜中读取(但尚未修改)的行中的数据.因此,两个事宜确实可以读取沟通的值.在断绝度很是低(Read Uncommitted)时,其他事宜乃至可以在修改后(但在提交之前)读取数据…

查察有关SQL Server断绝级别here的具体信息

因此,底线是断绝级别在这里是一个重要的部门来节制其他事宜进入这个会见的会见级别.

留意.从link开始,关于Serializable
语句无法读取已修改但尚未由其他事宜提交的数据.
这是由于在修转业时安排锁,而不是在Begin Trans产生时安排,以是你所做的也许如故应承另一个事宜读取旧值,直到修改它为止.以是我会改变逻辑,在你读取它的统一个语句中修改它,从而同时锁定它.

begin tran
declare @x int
update def set @x= nextcode,nextcode += 1
waitfor delay '00:00:15'
select @x
commit tran

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读