DCSIMG
Insert and Update pattern for multiple threads application with SQL Server - Rotem Bloom's Blog

Rotem Bloom's Blog

Share knowledge on .NET and web development

News

About Me

Glad to help and share knowledge on .NET and also huge fan of Dream Theater.

Contact me via messenger

View Rotem Bloom's profile on LinkedIn

Dream Theater Pics

Blogs I Read

Insert and Update pattern for multiple threads application with SQL Server

Hi, 

Have you ever try to insert a row in to a SQL table if the key does not exist and update a row if a key exists. Well this is very common scenario.

Usually you would achieve this goal by writing SQL like:

if exists (select * from TestTable where ID = @id)

begin

    update TestTable set myCount = myCount+1  where ID = @id

end

else

begin

  insert into TestTable values (@id, 1)

end

This code will work fine for single threaded applications but will not work for multiple threads application. To solve this issue you need to handle primary key violations and fix up the transactional integrity of the batch.

 So now let's see the solutions:

Option 1:

begin tran

if exists (select * from TestTable with (updlock,serializable) where ID = @id)

begin

  update TestTable set myCount = myCount+1 where ID = @id

end

else

begin

  insert TestTable (ID, myCount) values (@id, 1)

end

commit tran

Option 2:

begin tran

  update TestTable with (serializable) set myCount = myCount + 1 where ID = @id
if @@rowcount = 0

begin

  insert TestTable (ID, myCount) values (@id,1)

end

commit tran

That's all.

Enjoy Rotem

Comments

Yaniv said:

Referring to Option 1:

I understand that if the EXISTS condition yields TRUE your shared locks are successfully converted to exclusive locks due to the UPDLOCK hint inside the transaction and that row is exclusively locked thus preventing (blocking) any access for other connections.

However, if the EXISTS yield false and you INSERT a new row that ID may have already been inserted by another connection.

In addition, the explicit transaction is required only for the purpose of the hints taking effect as it only handles a single DML operation that when working with the default isolation level READ-COMMITTED is handled as an implicit transaction by sql server any way.

# May 11, 2009 10:42 AM

Rotem Bloom said:

Hi Yaniv,

Thanks 4 your comments, Basically I agree but I'm not sure you are right on the INSERT issue you mention.

Can you suggest but can you suggest solution?

Thanks,

Rotem

# May 11, 2009 4:07 PM

Shlomi said:

Check out the new MERGE function in SQL 2008 :-)

# May 11, 2009 6:00 PM

Rotem Bloom said:

Well Yaniv,

I try test your comments on the " if the EXISTS yield false and you INSERT..." and you are not right it works as I expected. Lets say the ID column is Identity column I will never got primary key violations.

Thanks,

Rotem

# May 12, 2009 8:59 AM

Rotem Bloom said:

Shlomi thanks,

I know the MERGE function in SQL 2008 but I don't have 2008 on my current application.

thanks 4 your comment

# May 12, 2009 11:02 AM

software developers said:

That was an inspiring post,

Option 2 is clearly the one i will be going for

Keep up the good work

# October 23, 2009 3:25 PM
Leave a Comment

(required) 

(required) 

(optional)

(required) 


Enter the numbers above: