Showing posts with label exists. Show all posts
Showing posts with label exists. Show all posts

Wednesday, March 28, 2012

Question regarding stored procs

Hello,

It might be a basic question, but there it goes:

I have a store procedure that first checks if the record exists and, if
it doesn't, inserts the new record.

Is the scenario below possible?

(thread1) USER1 -> check if record "abc" exists
(thread2) USER2 -> check if record "abc" exists
(thread1) USER1 -> "abc" doesn't exist
(thread2) USER2 -> "abc" doesn't exist
(thread1) USER1 -> add "abc" as new record
(thread2) USER2 -> add "abc as new record (OPS, this is an error,
because "abc" already exists, it was just inserted by USER1)

I am wondering if this kind of concurrent, multi-threaded access
happens with stored procedures.

If yes, can I execute a procedure from start to finish without any
other simultaneous procedure interrupting?

I appreciate any information about this.

Leonardo.Hi Leonardo,

The answer to your first question is yes; if you do not establish a
transaction (with the appropriate locking mechanism), then you can have
concurrency issues. However, you can establish a transaction and set
the isolation level to a higher restriction to avoid this scenario.

Check the SQL Server Books OnLine for transactions and transaction
isolation levels; that should get you started.

HTH,
Stu|||(leodippolito@.gmail.com) writes:
> It might be a basic question, but there it goes:
> I have a store procedure that first checks if the record exists and, if
> it doesn't, inserts the new record.
> Is the scenario below possible?
> (thread1) USER1 -> check if record "abc" exists
> (thread2) USER2 -> check if record "abc" exists
> (thread1) USER1 -> "abc" doesn't exist
> (thread2) USER2 -> "abc" doesn't exist
> (thread1) USER1 -> add "abc" as new record
> (thread2) USER2 -> add "abc as new record (OPS, this is an error,
> because "abc" already exists, it was just inserted by USER1)

Yes.

> I am wondering if this kind of concurrent, multi-threaded access
> happens with stored procedures.
> If yes, can I execute a procedure from start to finish without any
> other simultaneous procedure interrupting?

You would need to enclose the IF EXISTS + SELECT in a transaction.
Furthermore, you must make sure that the isolation level is serializable.
The defuault isolation level in SQL Server is READ COMMITTED, which
means that once the EXISTS check has passed, locks are released.

The best solution is to add the table hint "WITH (UPDLOCK)" in the
EXISTS query. This would make USER2 in this example to be blocked
already at this point. If you just use SET TRANSACTION ISOLATION
LEVEL, the two processes will deadlock.

One way to test issues like this, is to insert a WAITFOR in the code,
and then run from separate windows in Query Analyzer.

--
Erland Sommarskog, SQL Server MVP, esquel@.sommarskog.se

Books Online for SQL Server SP3 at
http://www.microsoft.com/sql/techin.../2000/books.asp|||Erland, why do you say " If you just use SET TRANSACTION ISOLATION
LEVEL, the two processes will deadlock." ?

Suppose T1 executes with SERIALIZABLE and T2 tries to execute the same
proc at the same time ... Well, as far as I understand, T2 will wait
for T1 to finish and then go on.. right? Why exactly is " WITH
(UPDLOCK) " necessary?

If it's not a problem for you, could you provide me a safe (deadlock
free) example of insert procedure that would check the existance of the
record before inserting?

Thanks for all.

Leonardo.|||(leodippolito@.gmail.com) writes:
> Erland, why do you say " If you just use SET TRANSACTION ISOLATION
> LEVEL, the two processes will deadlock." ?
> Suppose T1 executes with SERIALIZABLE and T2 tries to execute the same
> proc at the same time ... Well, as far as I understand, T2 will wait
> for T1 to finish and then go on.. right? Why exactly is " WITH
> (UPDLOCK) " necessary?

Because with plain serializable this happens:

T1 performs NOT EXISTS check, and retains a shared lock
T2 performs NOT EXISTS check, and retains a shared lock
T1 tries to insert, but is blocked by T2
T2 tries to insert, but is blocked by T1
=> Deadlock

UPDLOCK is a shared lock, so it does not block other readers. However,
only one process have an UPDLOCK on a resource, so T2 would be blocked
until T1 has committed. And when T2 goes ahead, T2 finds that the rows
is already there, and does not try to insert.

> If it's not a problem for you, could you provide me a safe (deadlock
> free) example of insert procedure that would check the existance of the
> record before inserting?

Hey, that's what I leave as an exercise to the reader. :-) Seriously,
I encourage you to try these things by running from separate windows
in Query Analyzer, and try the various possibilities, to see what deadlocks,
what gives errors and what works smoothly. This is a good lab exercise
to get an understanding of things. What is problematic is to emulate
the concurrency, but some WAITFOR statements are usually good enough.

--
Erland Sommarskog, SQL Server MVP, esquel@.sommarskog.se

Books Online for SQL Server SP3 at
http://www.microsoft.com/sql/techin.../2000/books.asp

Monday, March 12, 2012

Question on Process killed and still exists with a killed/rollback

Hi
I have killed a process running from sql server agent. the process id is 55
and when i give sp_who2 it still shows the process as killed /rollback. whe
n
i give the command kill 55 it says 100% rollback complete, but still the
process exists. Any suggestions to kill this process completely.
Thanks
RodgerRodger,
You cannot kill a process that is in the middle of Rolling back (it
must be a rather long transaction). Unfortunately you will need to
wait patiently until the rollback finishes. Use Kill WITH STATUS ONLY
will show you how fast the rollback has finished.
Attempt to stop a rollback process e.g. restart the SQL Instance will
only cause the rollback run even longer.|||Someone asked essentially the same question just a few days ago. Your
process may be blocked or perhaps it had a massive amount of uncommitted
data changes when you first attempted to kill it, and this thread discusses
various options.
http://groups.google.com/group/micr...1637c15f84fa05f
Another consideration going forward is to verify that your database
transaction log is located on a seperate physical disk from your database
data file. When rolling back a large transaction, both the data and log
files get hit heavily and keeping them on seperate drives decreases the time
required to recover due to parallel I/O processing.
"Rodger" <Rodger@.discussions.microsoft.com> wrote in message
news:3F59A2B2-9606-4409-8434-39DF9D4366C0@.microsoft.com...
> Hi
> I have killed a process running from sql server agent. the process id is
> 55
> and when i give sp_who2 it still shows the process as killed /rollback.
> when
> i give the command kill 55 it says 100% rollback complete, but still the
> process exists. Any suggestions to kill this process completely.
> Thanks
> Rodger

Question on Process killed and still exists with a killed/roll

Sometimes it does take a little bit time to finish off the rollback
(despite it indicates it is 100% completed'), but if the process still
there after let say good 10 mins. Run 'select * from sysprocesses' on
the master database and see if there is any lock problem there. Check
the 'blocked' field of the process.
Also check the SQL logs to see for any exceptions/errors. What SQL
platform you are on? What Service Pack you have installed.
Regards,
Mel
"MSLam" wrote:

> Sometimes it does take a little bit time to finish off the rollback
> (despite it indicates it is 100% completed'), but if the process still
> there after let say good 10 mins. Run 'select * from sysprocesses' on
> the master database and see if there is any lock problem there. Check
> the 'blocked' field of the process.
> Also check the SQL logs to see for any exceptions/errors. What SQL
> platform you are on? What Service Pack you have installed.
> Regards,
> Mel
>