Go Premium for a chance to win a PS4. Enter to Win

x
?
Solved

Locking SQL row query

Posted on 2013-01-28
9
Medium Priority
?
362 Views
Last Modified: 2013-01-28
Hello,

I know there is a great detail of information on locking but I'm struggling to do something which, to me, should be quite straightforward.

My application assigns an order id from a sequence held in a parameter table.  I need to be able to select the current 'nextorderid' from the table 'parameters' and then increment the value by 1 ready for the next order.

I can select and do the update with no problem but I need to understand how to lock the row for the split second between the select and the subsequent update so that another user cannot be assigned the same id. I've tried the following:-

 Dim daParameters = New SqlDataAdapter("SELECT * from Parameters WITH (ROWLOCK)", oSQLConnection)
        Dim tblParameters As New DataTable
        daParameters.Fill(tblParameters)

but the management studio still allows me to edit the row.  I'm obviously missing something.

Any help gratefully received.

Thanks
0
Comment
Question by:Petermcg001
  • 3
  • 2
  • 2
  • +1
9 Comments
 
LVL 11

Expert Comment

by:SThaya
ID: 38826428
can you try the below


SELECT * from Parameters WITH (NOLOCK)
0
 
LVL 11

Expert Comment

by:SThaya
ID: 38826435
have you tried with SQL transaction

http://www.informit.com/articles/article.aspx?p=26657
0
 
LVL 57

Expert Comment

by:Raja Jegan R
ID: 38826438
Hi Petermcg001,

To answer your question, you need to do a ROWLOCK of your existing column and release the lock once it is successfully inserted into a table. Concurrent users will be held under waiting till the time you release this particular record.

But a more elegant solution for your issue would be to use an Identity datatype column to avoid these lockings and other concurrency issues.
once a record is inserted into the first table, an Identity value would be generated which can be fetched using SCOPE_IDENTITY() function and the concurrent user also will get another primary key value without any issues.
For more detailed info about IDENTITY datatype and SCOPE_IDENTITY() functions, you can see the below links:
http://msdn.microsoft.com/en-us/library/ms189838.aspx
http://msdn.microsoft.com/en-us/library/ms190315.aspx
0
Concerto Cloud for Software Providers & ISVs

Can Concerto Cloud Services help you focus on evolving your application offerings, while delivering the best cloud experience to your customers? From DevOps to revenue models and customer support, the answer is yes!

Learn how Concerto can help you.

 
LVL 1

Author Comment

by:Petermcg001
ID: 38826461
Hello,

Thanks for looking at this.  I'm including the "WITH (ROWLOCK)" in my SQL command so I am wondering why this doesn't seem to be locking the record?
0
 
LVL 57

Expert Comment

by:Raja Jegan R
ID: 38826668
Petermcg001,

kindly post the complete set of commands you are using to confirm whether there is something wrong in the way you are doing it..
0
 
LVL 18

Expert Comment

by:deighton
ID: 38826790
increment the value and return the value within a transaction

Dim cmdParameters as New SqlCommand("BEGIN TRAN; DECLARE @VAL int;UPDATE Parameters SET YourParamaeter = YourParamaeter + 1  WHERE <your where clause here>; SELECT @VAL = YourParamaeter from Parameters WHERE <your where clause here>;SELECT @VAL - 1;Commit tran;", oSQLConnection)
dim iVal as integer = cmdParameters.executeScalar
0
 
LVL 1

Author Comment

by:Petermcg001
ID: 38826847
Hello deighton,

thanks for that, it does the increment of the id fine.

Can I just confirm that it is the fact that the commands are wrapped up in a transaction which means that the row ( there will only be one row in the table ) will be locked whilst the transaction is in process?  I could therefore use this approach anywhere to lock rows?

Thanks
0
 
LVL 18

Accepted Solution

by:
deighton earned 2000 total points
ID: 38826983
hi, that's my theory.

The theory is that once a value is updated in a transaction, the record should remain locked to prevent the change being usurped by any other process.  Then having incremented the value and having that value, you can proceed to use it.

If any other process comes along and increments the value, it is already incremented, so they get the next value.
0
 
LVL 1

Author Closing Comment

by:Petermcg001
ID: 38827006
Thanks for your help.
0

Featured Post

Keep up with what's happening at Experts Exchange!

Sign up to receive Decoded, a new monthly digest with product updates, feature release info, continuing education opportunities, and more.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

This article shows gives you an overview on SQL Server 2016 row level security. You will also get to know the usages of row-level-security and how it works
In part one, we reviewed the prerequisites required for installing SQL Server vNext. In this part we will explore how to install Microsoft's SQL Server on Ubuntu 16.04.
Familiarize people with the process of retrieving data from SQL Server using an Access pass-thru query. Microsoft Access is a very powerful client/server development tool. One of the ways that you can retrieve data from a SQL Server is by using a pa…
Viewers will learn how the fundamental information of how to create a table.

926 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question