Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server:按过程调用递增非标识int列_Sql Server - Fatal编程技术网

Sql server SQL Server:按过程调用递增非标识int列

Sql server SQL Server:按过程调用递增非标识int列,sql-server,Sql Server,我在DB表中有一列,当我们选择某个项目时,它必须是递增的。但它可以并行选择,对于任何记录,它都必须从0开始。我的解决方案是从DB过程中增加值,但我是否可以确保第一个过程在另一个过程希望加载要增加的值之前设法增加值?我的意思是: t0 Value is 10 t1 Procedure1 valueToInc = Value t2 Procedure2 valueToInc = Value t3 Procedure1 valueToInc ++ t4 Procedure2 valueToInc ++

我在DB表中有一列,当我们选择某个项目时,它必须是递增的。但它可以并行选择,对于任何记录,它都必须从0开始。我的解决方案是从DB过程中增加值,但我是否可以确保第一个过程在另一个过程希望加载要增加的值之前设法增加值?我的意思是:

t0 Value is 10
t1 Procedure1 valueToInc = Value
t2 Procedure2 valueToInc = Value
t3 Procedure1 valueToInc ++
t4 Procedure2 valueToInc ++
t5 Value = 11
t6 Value = 11
从过程1回写的值是11,但从过程2回写的值显然也是11(需要在那里确保12)

我还检查了标识(属性)和序列(Transact-SQL),但似乎没有什么适合我的

编辑

我试图解决的是,我有一个控制台应用程序——TCP服务器和MSSQL数据库,其中有一个用户表。每次单个用户想要登录时,我都必须增加users loginCount字段。我知道,这里的任何并行化都不应该是可能的,或者是可以从代码中管理的,但有人告诉我,我必须通过数据库处理并行访问,所以不仅仅是使用更新查询。我把它作为面试项目


我想通过我的第一个解释使理解变得更容易,但它不起作用。

使用事务隔离级别等于的事务

可序列化

  • 语句无法读取已修改但尚未由其他事务提交的数据
  • 在当前事务完成之前,其他事务不能修改当前事务读取的数据
  • 在当前事务完成之前,其他事务无法插入键值在当前事务中任何语句读取的键值范围内的新行
不要加载
值来增加它:增加它,然后选择它(在事务中)。这将锁定表/行(取决于其他事务的更新/选择)。

您只需使用

UPDATE Users
SET LoginCount = ISNULL(LoginCount,0) + 1
WHERE UserId = @UserId

这在并发条件下是完全安全的。

您是说您有一个列,并且需要不断地通过向其中添加1来更改该值吗?身份在这方面没有帮助。我得说我从未听说过这样的要求。无论你做什么,你都需要处理并发性,这取决于你真正想做什么,这可能是相当具有挑战性的。谢谢你的评论。我不确定“持续”这个词是否正确,但有时它可能会发生,一次两次访问对于处理知道一行被“选择”了多少次的要求是必要的?字面上的选择,或者你的意思是用户“挑选”到某处使用?或者这是一个乐观的并发工具?我认为目前最大的问题是没有人知道你在做什么。请试着解释一下你想做什么。也许是一个示例表和过程的解释。谢谢你的评论,我试图在编辑中更好地解释它。谢谢你的回答。在那里它被很好地展示了。