Locking SQL row query

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
LVL 1
Petermcg001Asked:
Who is Participating?
 
deightonConnect With a Mentor Commented:
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
 
SThayaTechnical MAnagerCommented:
can you try the below


SELECT * from Parameters WITH (NOLOCK)
0
 
SThayaTechnical MAnagerCommented:
have you tried with SQL transaction

http://www.informit.com/articles/article.aspx?p=26657
0
Never miss a deadline with monday.com

The revolutionary project management tool is here!   Plan visually with a single glance and make sure your projects get done.

 
Raja Jegan RSQL Server DBA & ArchitectCommented:
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
 
Petermcg001Author Commented:
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
 
Raja Jegan RSQL Server DBA & ArchitectCommented:
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
 
deightonCommented:
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
 
Petermcg001Author Commented:
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
 
Petermcg001Author Commented:
Thanks for your help.
0
All Courses

From novice to tech pro — start learning today.