【发布时间】:2016-09-21 18:05:28
【问题描述】:
我有几个插入查询合并在事务中。第一个插入是创建新的产品文章编号,将表中最高的产品编号递增一。不幸的是,我只是注意到mostly 在测试期间,例如,如果来自两个不同应用程序的两个用户单击触发我的交易方法的按钮,他们可以获得相同的新产品编号。怎样才能避免这种情况?是否有类似锁定第一次插入的东西,这样如果第一个用户访问表以插入限制其他用户的插入,那么他们必须在第一个用户插入完成后在队列中等待?有没有类似的东西?此外,我认为如果有人插入其他用户无法插入。我用你理解的代码制作了 cmets。
我的部分交易查询如下:
Public Sub ProcessArticle(ByRef artikel As ArticlesVariations)
Dim strcon = New AppSettingsReader().GetValue("ConnectionString", GetType(System.String)).ToString()
Using connection As New SqlConnection(strcon)
connection.Open()
Using transaction = connection.BeginTransaction()
Try
For Each kvp As KeyValuePair(Of Integer, Artikel) In artikel.collection
articleIndex = kvp.Key
Dim art As Artikel = kvp.Value
Using cmd As New SqlCommand("INSERT INTO tbArtikel (Nummer) VALUES (@Nummer);Select Scope_Identity()", transaction.Connection)
cmd.CommandType = CommandType.Text
cmd.Connection = connection
cmd.Transaction = transaction
'Get next product number from table tbArtikel (this will be new product number)'
Dim NewArtNummer as String = New DALArtikel().GetNewArtikelNumber(transaction)
art.Nummer = NewArtNummer
cmd.Parameters.AddWithValue("@Nummer", art.Nummer)
'Get inserted product id for other diffrent inserts below'
newArticleRowId = CInt(cmd.ExecuteScalar())
'....
other INSERTs queries to other tables ...
...'
transaction.Commit()
Catch ex As Exception
transaction.Rollback()
Throw 'Rethrow exception.'
End Try
End Using
End Using
End Sub
【问题讨论】:
-
为这些东西分配某种独特的价值与 AutoIncrement PK 没有太大不同。您需要找到一种在插入行时分配值的方法。由于它显然是一个具有 3 个值的字符串,因此可能是一个存储过程。尤其是在也是一个交易的循环中,您将有很多欺骗
-
@Plutonix 嗨,Plutonix,有没有办法从我展示的方法中做到这一点?
-
我不知道
DALArtikel().GetNewArtikelNumber(transaction)做了什么,但大概它会查看数据库中的行,执行某种 Max()+1。如果另一个用户正在做同样的事情,他/她将获得相同的值。 -
@Plutonix 这背后还有更多,但我可以说 - 是的 - 这是一种方法,它正在做一些事情,比如从文章表中获取最大值并增加它,这样我就会得到新的数字。 P.S 我认为这不是关于插入语句本身,而是因为 NewArtNummer 过程对吗?
-
由于它在事务中,所有这些计算在您提交之前都是暂定的 - 让其他用户有更多时间做同样的事情并获得相同的数字。
标签: sql-server vb.net tsql