Download pptx - SqlSaturday199 - Deadlocks

Transcript
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