Improve company productivity with a Business Account.Sign Up

x
?
Solved

Locking SQL row query

Posted on 2013-01-28
9
Medium Priority
?
364 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
What Kind of Coding Program is Right for You?

There are many ways to learn to code these days. From coding bootcamps like Flatiron School to online courses to totally free beginner resources. The best way to learn to code depends on many factors, but the most important one is you. See what course is best for 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

What Kind of Coding Program is Right for You?

There are many ways to learn to code these days. From coding bootcamps like Flatiron School to online courses to totally free beginner resources. The best way to learn to code depends on many factors, but the most important one is you. See what course is best for you.

Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Native ability to set a user account password via AD GPO was removed because the passwords can be easily decrypted by any authenticated user in the domain. Microsoft recommends LAPS as a replacement and I have written an article that does something …
During the weekend, I was asked to investigate into a deadlock in SQL Server 2014. SQL being something I don’t really fancy myself being an expert at, I had to do some refreshing. This article is a collection of my notes.
Via a live example combined with referencing Books Online, show some of the information that can be extracted from the Catalog Views in SQL Server.
This videos aims to give the viewer a basic demonstration of how a user can query current session information by using the SYS_CONTEXT function

606 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