SqlSaturday199 - Deadlocks

30
Deadlock detected! All is lost or it's too early to sound the alarm? Denis Reznik

description

"Deadlock" is a terrible word, isn't it? Is it as scary as it sounds? Why do they occur and how can they affect an application? Significantly important question is how to solve "Deadlock" issues? The answers to these questions can be found in my session, which is completely dedicated to the fundamental principles of locking and isolation levels.

Transcript of SqlSaturday199 - Deadlocks

Page 1: SqlSaturday199 - Deadlocks

Deadlock detected! All is lost or it's too early to sound the alarm?Denis Reznik

Page 2: SqlSaturday199 - Deadlocks

Sponsors

Page 3: SqlSaturday199 - Deadlocks

About me

Denis Reznik Kiev, Ukraine Database Architect at The Frayman Group Microsoft MVP Community enthusiast

3 |

Page 4: SqlSaturday199 - Deadlocks

Agenda

Locks Lock Types Transaction Isolation Levels

Deadlocks Classic Deadlocks Not obvious deadlocks Deadlock detecting and analyzing

Page 5: SqlSaturday199 - Deadlocks

Lock Types- Shared

S S

X

Page 6: SqlSaturday199 - Deadlocks

Lock Types - Exclusive

X

XS

Page 7: SqlSaturday199 - Deadlocks

Lock Types - Update

U

US

SX

Page 8: SqlSaturday199 - Deadlocks

Lock Types – Intent locks

S

ISIS

Page 9: SqlSaturday199 - Deadlocks

READ UNCOMMITTED

The less restricted Isolation Level Allow all collisions, which READ

COMMITTED allow Allow Dirty Reads Doesn’t set Shared locks on read operations

Page 10: SqlSaturday199 - Deadlocks

DemoREAD UNCOMMITTED

Page 11: SqlSaturday199 - Deadlocks

DIRTY READS

ID City

1 Kiev

2 Sofia

3 Sofia

4 Sofia

5 Moscow

6 New York

7 New York

SELECT * FROM UsersWHERE City = 'Kiev'

BEGIN TRANUPDATE Users SET City = 'Sofia'WHERE City = 'Kiev'

ID City

1 Sofia

2 Sofia

3 Sofia

4 Sofia

5 Moscow

6 New York

7 New York

SELECT * FROM UsersWHERE City = 'Kiev'0 Records

ROLLBACK

SELECT * FROM UsersWHERE City = 'Kiev'

X

Page 12: SqlSaturday199 - Deadlocks

READ COMMITTED

Default Isolation Level Doesn’t allow Dirty Reads Shared locks released after the read

Page 13: SqlSaturday199 - Deadlocks

NO DIRTY READS

ID City

1 Kiev

2 Sofia

3 Sofia

4 Sofia

5 Moscow

6 New York

7 New York

SELECT * FROM UsersWHERE City = 'Kiev'

BEGIN TRANUPDATE Users SET City = 'Sofia'WHERE City = 'Kiev'

ID City

1 Sofia

2 Sofia

3 Sofia

4 Sofia

5 Moscow

6 New York

7 New York

SELECT * FROM UsersWHERE City = 'Kiev'Wait for

Shared lock on the row

X S

Page 14: SqlSaturday199 - Deadlocks

DemoREAD COMMITTED

Page 15: SqlSaturday199 - Deadlocks

NON-REPEATABLE READS

ID City

1 Kiev

2 Sofia

3 Sofia

4 Sofia

5 Moscow

6 New York

7 New York

BEGIN TRAN

SELECT * FROM UsersWHERE City = 'Sofia'UPDATE Users

SET City = 'Kiev'WHERE Id = 2

ID City

1 Kiev

2 Kiev

3 Sofia

4 Sofia

5 Moscow

6 New York

7 New York

SELECT * FROM UsersWHERE City = 'Sofia'

X

S

S...

S

Page 16: SqlSaturday199 - Deadlocks

REPEATABLE READ

More restricted than READ COMMITTED Doesn’t allow Dirty Reads Doesn’t allow Non-Repeatable reads Shared locks are hold to the end of the

transaction

Page 17: SqlSaturday199 - Deadlocks

NO NON-REPEATABLE READS

ID City

1 Kiev

2 Sofia

3 Sofia

4 Sofia

5 Moscow

6 New York

7 New York

BEGIN TRAN

SELECT * FROM UsersWHERE City = 'Sofia'UPDATE Users

SET City = ‘Kiev'WHERE Id = 2

ID City

1 Kiev

2 Kiev

3 Sofia

4 Sofia

5 Moscow

6 New York

7 New York

SELECT * FROM UsersWHERE City = 'Sofia'

X

S

S...

S

COMMIT

Page 18: SqlSaturday199 - Deadlocks

DemoREPEATABLE READ

Page 19: SqlSaturday199 - Deadlocks

PHANTOM RECORDS

ID City

1 Kiev

2 Sofia

3 Sofia

4 Sofia

5 Moscow

6 New York

7 New York

BEGIN TRAN

SELECT * FROM UsersWHERE City = 'Sofia'UPDATE Users

SET City = 'Sofia'WHERE Id = 'Kiev'

ID City

1 Sofia

2 Sofia

3 Sofia

4 Sofia

5 Moscow

6 New York

7 New York

SELECT * FROM UsersWHERE City = 'Sofia'

X

S

S...

S

S

Page 20: SqlSaturday199 - Deadlocks

SERIALIZABLE

The most restricted Isolation Level Doesn’t allow Dirty Reads Doesn’t allow Non-Repeatable reads Doesn’t allow Phantom Records Lock range of keys

Page 21: SqlSaturday199 - Deadlocks

NO PHANTOM RECORDS

ID City

1 Kiev

2 Sofia

3 Sofia

4 Sofia

5 Moscow

6 New York

7 New York

BEGIN TRAN

SELECT * FROM UsersWHERE City = 'Sofia'UPDATE Users

SET City = 'Sofia'WHERE Id = 'Kiev'

ID City

1 Sofia

2 Sofia

3 Sofia

4 Sofia

5 Moscow

6 New York

7 New York

SELECT * FROM UsersWHERE City = 'Sofia'

X

RA

NG

E S

-S

...

COMMIT

Page 22: SqlSaturday199 - Deadlocks

DemoSERIALIZABLE

Page 23: SqlSaturday199 - Deadlocks

READ COMMITTED SNAPSHOT

Optimistic concurrency for reads Use row-version store in tempdb No shared locks on reads The same collisions as in READ

COMMITTED

Page 24: SqlSaturday199 - Deadlocks

READ COMMITTED SNAPSHOT

ID City

1 Kiev

2 Sofia

3 Sofia

4 Sofia

5 Moscow

6 New York

7 New York

BEGIN TRANUPDATE Users SET City = 'Sofia'WHERE City = 'Kiev'

SELECT * FROM UsersWHERE City = 'Kiev'

ID City

1 Sofia

2 Sofia

3 Sofia

4 Sofia

5 Moscow

6 New York

7 New York

SELECT * FROM UsersWHERE City = 'Kiev'

X

tempdb

ID City

1 Kiev

Version Store

Page 25: SqlSaturday199 - Deadlocks

DemoSNAPSHOT READ COMMITTED

Page 26: SqlSaturday199 - Deadlocks

SNAPSHOT

Optimistic concurrency for reads Use row-version store in tempdb No shared locks on reads Doesn’t allow Dirty Reads Doesn’t allow Non-Repeatable reads Doesn’t allow Phantom Records Update conflict detection

Page 27: SqlSaturday199 - Deadlocks

DemoSNAPSHOT

Page 28: SqlSaturday199 - Deadlocks

How to avoid?

Design database so, that it will be no possibility for a deadlock occur

Modify tables in the same order Choose appropriate Transaction Isolation

Level and check possibility of a deadlock in your Isolation Level

There is no unsolvable deadlocks.. But there can be solution, which will not suit you completely

Page 29: SqlSaturday199 - Deadlocks

Sponsors

Page 30: SqlSaturday199 - Deadlocks

Thank you!

Denis Reznik Twitter: @denisreznik Email: [email protected] Blog (in russian): http://reznik.uneta.com.ua Facebook: https://www.facebook.com/denis.reznik.5

LinkedIn: http://ua.linkedin.com/pub/denis-reznik/3/502/234