Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Do writes in SNAPSHOT isolation level block writes in another SNAPSHOT transaction in SQL Server 2008 R2

For SNAPSHOt isolation level in SQL Server 2008 R2, the following is mentioned in MSDN ADO.Net documentation:

Transactions that modify data do not block transactions that read data, and transactions that read data do not block transactions that write data, as they normally would under the default READ COMMITTED isolation level in SQL Server.

There is no mention of whether writes will block writes, when both transactions are in SNAPSHOT isolation mode. So my question is as follows: Will writes in a SNAPSHOT transaction1 block writes to same tables in another SNAPHOT transaction2?

LATEST UPDATE

After doing a lot of thinking on my question, I am coming to a conclusion as mentioned in paragraph below. Hope others can throw more light on this.

There is no relational database in which writes do NOT block writes. In other words, writes will always block writes. Writes would include statements like INSERT or UPDATE or DELETE. This is true no matter which isolation level you use, since all relational databases need to implement data consistency, when multiple writes are happening in database. Of course, the simultaneous writes need to be conflicting ( as in inserting into the same table or updating the same row/s) for this blocking to occur.

like image 345
Sunil Avatar asked Oct 02 '12 04:10

Sunil


People also ask

What is the disadvantage of snapshot isolation and why?

Concurrency problems are hard in the same way that multi-threaded programming is hard. Unless serializable isolation is used, it can be tough to code T-SQL transactions that will always function correctly when other users are making changes to the database at the same time.

How does Snapshot isolation level work?

Snapshot Isolation Level Extensions SNAPSHOT isolation specifies that data read within a transaction will never reflect changes made by other simultaneous transactions. The transaction uses the data row versions that exist when the transaction begins.

Is repeatable read the same as snapshot isolation?

A Critique of ANSI SQL Isolation Levels A confusing part is Repeatable Read and Snapshot Isolation are incomparable because each of them has its own anomaly; Repeatable Read cannot protect Phantom, but Snapshot Isolation cannot protect Write Skew and Phantom in some cases.

What is the difference between Serializable and snapshot isolation levels?

In Snapshot, the SQL server avoids locks by making use of row versioning. In Serializable, the SQL server makes use of locks and holds them until the transaction is committed or aborted.


2 Answers

Ligos is actually incorrect - if two separate transactions are trying to update the same record with Snapshot on, transaction 2 WILL be blocked until transaction 1 releases the lock. Then, and ONLY then, will you get error 3960. I realize this thread is over 2 years old, but I wanted to avoid miss-information being out there.

Even the link Ligos references says the exact same thing I am mentioning above (check out the last non-red paragraph)

Write vs. Write will only not be blocked if the two records (ie. rows) trying to be updated are different

like image 131
Scott Avatar answered Sep 20 '22 23:09

Scott


No. They will not block. Instead, the UPDATE command in trans2 will fail with error number 3960.

Because of how SNAPSHOT isolation level works, any UPDATE command may fail. The only way you can tell is to catch and handle error 3960 (it is called optimistic concurrency because you don't expect this situation to happen very often).

I ended up testing this empirically, because it's not entirely obvious from the documentation. This blog post illustrates it nicely though.


Assumption: both trans1 and trans2 are UPDATEing the same row in the same table. Updating two different rows should work just fine.

like image 29
ligos Avatar answered Sep 21 '22 23:09

ligos