读/写死锁

简介:

读/写死锁

下列代码展示了简单的表定义,这里我也插入2条记录。 

复制代码
-- Create a new table
CREATE TABLE Foo
(
    Col1 INT IDENTITY(1, 1) NOT NULL PRIMARY KEY,
    Col2 INT,
    Col3 INT
)
GO

-- Insert 2 records
INSERT INTO Foo VALUES (1, 1), (2, 2)
GO

SELECT * FROM Foo
GO
复制代码

现在假设下列情况:你有2个查询,用来读写访问记录,但你用不同的顺序访问记录。第1个事务进行下列操作

  • UPDATE第1条记录
  • SELECT第2条记录

第2个事务用相反的顺序访问同样的记录:

  • UPDATE第2条记录
  • SELECT第1条记录

下列代码展示了这2个事务:

复制代码
-- UPDATE 1st record
-- SELECT 2nd record
BEGIN TRANSACTION

UPDATE Foo SET Col3 = 3
WHERE Col1 = 1

SELECT * FROM Foo
WHERE Col1 = 2

ROLLBACK
GO

-- UPDATE 2nd record
-- SELECT 1st record
BEGIN TRANSACTION

UPDATE Foo SET Col3 = 3
WHERE Col1 = 2

SELECT * FROM Foo
WHERE Col1 = 1

ROLLBACK
GO
复制代码

如果时机合适的话,这里很容易触发死锁。因为2个事务都要在第1条和第2条记录上获得排它锁(X),然后他们不能在另一条记录上获得共享锁(S)——死锁发生!

你如何解决这个死锁呢?有很多方法:

  • 在你整个事务里按同样的顺序访问记录(第1条,然后第2条)
  • 在事务外进行SELECT语句
  • 在SELECT语句期间,启用提交读快照隔离级别( Read Committed Snapshot Isolation )来避免共享锁

小结

在今天的文章里,我向你展示了,SQL Server里,当你在一个表,在不同的顺序访问的事务里,是很容易触发死锁的。当你写你的查询时,你必须要认真考虑,按实际情况实现你的查询。经常有其他人可以阻塞你。



本文转自Woodytu博客园博客,原文链接:http://www.cnblogs.com/woodytu/p/6202539.html,如需转载请自行联系原作者

相关文章
|
8月前
|
监控 算法 安全
怎么防止死锁
怎么防止死锁
|
8月前
|
安全 算法 程序员
|
8月前
|
安全
什么是死锁?互斥锁进入死锁怎么解决?
什么是死锁?互斥锁进入死锁怎么解决?
|
8月前
|
安全 Java 测试技术
发生死锁怎么办
发生死锁怎么办
71 0
|
8月前
死锁的发生与避免
死锁的发生与避免 死锁是指两个或者多个进程在执行过程中,因争夺资源而造成的一种僵局,若无外力作用,它们都将无法推进下去。在计算机系统中,死锁是一种常见的问题,因此需要采取一些措施来避免死锁的发生。
106 0
|
安全 算法
死锁的总结(1)
死锁的总结
44 0
|
安全 算法
初识死锁问题
关于对死锁的详解
|
程序员 Linux 芯片
|
算法 Unix Linux
什么是死锁
什么是死锁
150 0