?
Solved

How to RowLock in a Stored Proc?

Posted on 2003-11-21
12
Medium Priority
?
1,876 Views
Last Modified: 2012-08-13
Hi All.

 i have some C# code that basically calls two stored procs.

pseudo code

objThing.Get()  -> this calls stored proc usp_Thing_Get, which is a basic SELECT *

objThing.Money = 100 + intNewAmount;

objThing.Set()  -> this calls stored proc usp_THING_Set, which UPDATES a row.


now, i need to lock the row in the GET, and then UNLOCK IT after i do a set ....

any suggestions please?  i have NO idea how this can be done :(

thanks in advance.
0
Comment
Question by:pure032398
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 5
  • 2
  • 2
  • +3
12 Comments
 
LVL 18

Expert Comment

by:ShogunWade
ID: 9795788
You should not do it in this way.

Assuming that "pseudo code" is actually pretty much what you want to do, then what you ort to be doing is encapsulating all of this functionality in a single stored procuedre wrapped in a transaction.
0
 
LVL 6

Expert Comment

by:BAlexandrov
ID: 9795797
objThing.BeginTransaction()
...
objThing.Commit()
0
 
LVL 7

Expert Comment

by:wsteegmans
ID: 9796334
Indeed, you could use a Transaction for your problem. When starting a Transaction (BeginTransaction) you can specify the Isolationlevel. So, here you set who can view/change recordfields of a LOCKED record ...

Using Transactions is very simple, ... transactions offer the developer the ability to enforce data integrity by making sure multiple operations can be treated by the engine as an "all or nothing" proposition, thereby never allowing the database to end up in an inconsistent state.

Some code?
I think you have here a nice story:
http://www.c-sharpcorner.com/asp/Code/TransactionsInASPNETDPL.asp

Look also in the MSDN ...

You could also do it on SQL-Server level, with the <table_hint> part in the FROM clause:

Table Hint Syntax

SYNTAX
[ FROM { < table_source > } [ ,...n ] ]

< table_source > ::=
    table_name [ [ AS ] table_alias ] [ WITH ( < table_hint > [ ,...n ] ) ]
   
< table_hint > ::=
    { INDEX ( index_val [ ,...n ] )
        | FASTFIRSTROW
        | HOLDLOCK
        | NOLOCK
        | PAGLOCK
        | READCOMMITTED
        | READPAST
        | READUNCOMMITTED
        | REPEATABLEREAD
        | ROWLOCK
        | SERIALIZABLE
        | TABLOCK
        | TABLOCKX
        | UPDLOCK
        | XLOCK
    }

There are fifteen hints defined in this syntax listing. Thirteen of these hints (HOLDLOCK, NOLOCK, PAGLOCK, READCOMMITTED, READPAST, READUNCOMMITTED, REPEATABLEREAD, ROWLOCK, SERIALIZABLE, TABLOCK, TABLOCKX, UPDLOCK, XLOCK) are considered table-level.
More info: http://www.sql-server-performance.com/rd_table_hints.asp

But, because you call two SPs seperately? I don"t know if this second part will work?
Why not building ONE stored procedure with all the logic and passing parameters ...? It makes things more simple!
0
Get your Conversational Ransomware Defense e‑book

This e-book gives you an insight into the ransomware threat and reviews the fundamentals of top-notch ransomware preparedness and recovery. To help you protect yourself and your organization. The initial infection may be inevitable, so the best protection is to be fully prepared.

 
LVL 1

Author Comment

by:pure032398
ID: 9796996
the reason i have two stored procs, is becuase i could do multiple calculations between the GET (select *) and the SET (update ).

i do not wish to pass the calcualtions to the SP becuase under certain curcumstances, it could be very complex - i need to keep the business logic on one Tier, and the Data on another.

the second reason i didn't mention transactions was becuase i do not know much about them -AND- i wasn't sure that if begin a transaction, this ROW LOCKS the data i am after.

why am i so interested in this row locking?

i have a multithreaded game which needs to make sure the data is always consisent.

i know that if i can LOCK a row when i read it (becuase i'm about to change the data), then i'm 100% sure than any other threads that wish to access this row will wait (or timeout) until it's unlocked.

i do not want to have two threads read the same data, and update the same row with different data.  I also do not wish to do some timestamp comparrison on the table / row, becuase then i need to do MORE work to re-read the data, then re-calc, then update ... and i could get could in an infinite loop as many threads are all fighting for the same row, etc.
0
 
LVL 1

Author Comment

by:pure032398
ID: 9797022
a further question relating to a comment above...

if i use transactions, could that row lock between the start and the commit?

eg.

// Somehow knows to lock row #10 (for example)
objThing.BeginTransaction()

// some business logic / calculations here ...
eg. intHealth += 10;   // very simple example, but can be very complex here...

objThing.Commit()
// Row now updated _AND_ unlocked.

??? is this the idea?
0
 
LVL 75

Expert Comment

by:Anthony Perkins
ID: 9798001
Please maintain these old open questions:

1 07/28/2003 60 How to Serialize two (different) instanc...  Open C#
2 07/20/2003 450 How to maintain Data Integrity with our ...  Open C#

Thanks,
Anthony
0
 
LVL 1

Author Comment

by:pure032398
ID: 9800766
Anthony  - those previous posts/open questions are maintained / updated.


now back to the topic ....

can stored_procs manually lock and unlock a row, or does this have to be asked elsewhere?
0
 
LVL 75

Expert Comment

by:Anthony Perkins
ID: 9800919
>> those previous posts/open questions are maintained / updated.<<
Thanks, I appreciate it.

Anthony
0
 
LVL 69

Accepted Solution

by:
Scott Pletcher earned 2000 total points
ID: 9810826
You can explicitly specify locking using "hints" to increase the locking level from shared to exclusive, which will prevent anyone else from reading the row until you're done *if done as part of transaction*:

BEGIN TRAN

SELECT ...
FROM ... WITH (ROWLOCK, XLOCK)
WHERE ...

UPDATE ...
SET ...

END TRAN


I think, but am not sure, that XLOCK was added in SQL 2K; if so, naturally it won't work if your db is 7.0.
0
 
LVL 18

Expert Comment

by:ShogunWade
ID: 9810932
As I and others have said.   Perform a transaction.  If you dont want to make this one stored proc (which is the sensible thing) then at least put a transaction on connection object!
0
 
LVL 1

Author Comment

by:pure032398
ID: 9814201
I figured this out last night .. but yeah, the XLOCK was the answer.

becuase i'm not using one stored proc, because my business logic has to be handled in my C# code, using an ADO.Net Transaction works perfectly.

0
 
LVL 1

Author Comment

by:pure032398
ID: 9814214
One other thing relating to the Accepted Answer -> i found the XLOCK solution becuase i saw some documentation for 'WITH UPDATE" in some Sql doco..

how does WITH UPDATE differ from XLOCK?
0

Featured Post

Will your db performance match your db growth?

In Percona’s white paper “Performance at Scale: Keeping Your Database on Its Toes,” we take a high-level approach to what you need to think about when planning for database scalability.

Question has a verified solution.

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

Ever needed a SQL 2008 Database replicated/mirrored/log shipped on another server but you can't take the downtime inflicted by initial snapshot or disconnect while T-logs are restored or mirror applied? You can use SQL Server Initialize from Backup…
Recently we ran in to an issue while running some SQL jobs where we were trying to process the cubes.  We got an error saying failure stating 'NT SERVICE\SQLSERVERAGENT does not have access to Analysis Services. So this is a way to automate that wit…
This video shows how to set up a shell script to accept a positional parameter when called, pass that to a SQL script, accept the output from the statement back and then manipulate it in the Shell.
Via a live example, show how to extract information from SQL Server on Database, Connection and Server properties
Suggested Courses

752 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