死锁的产生和解除 死锁(deadlock)指进程之间互相永久阻塞的状态,Microsoft SQL Serv er 数据库引擎实例可以检测到死锁,并选择终止其中一个事务以干预死锁状态。两个进程发生死锁的典型例子是:进程T1 中获取锁A,申请锁B;进程T2 中获取锁B,申请锁A,下面动手来演示死锁的发生和检测: 1. 在 SQL Serv er Management Stu dio 的“标准”工具栏上,单击“新建查询”按钮。此时将使用当前连接打开一个查询编辑器窗口。 2.在查询编辑器窗口输入如下脚本,并执行。将在 TempDB 数据库中创建Teacher 表并填充 3 条数据: USE TempDB;/*使用TempDB作为当前数据库*/ GO --TempDB数据库中若存在用户创建的表Teacher,则删除之。 IF OBJECT_ID(N'TempDB..Teacher', N'U') IS NOT NULL DROP TABLE Teacher; GO CREATE TABLE Teacher ([ID] int identity,[name] nchar(10),[birthday]datetime,depatrment nchar(4),salary int null) GO Begin transaction Insert into teacher values ('王伟',1990-03-02,'计算机系',1000) Insert into teacher values ('李红',1900-08-08,'计算机系',1500) Insert into teacher values ('李强',1975-03-02,'计算机系',2000) If @@error>0 rollback transaction Else commit transaction select * from Teacher; 3. 在SQL Server Management Studio 的两个窗口中同时执行下面的查询: 这段代码在默认的READ COMMITTED 隔离级别下运行,两个进程(任务)分别在获取一个排它锁的情况下,申请对方的共享锁从而造成死锁。 可见一个进程可以正常更新并显示结果,而另一个进程已经被回滚: 消息 1205,级别 13,状态 45,第 3 行 Use TempDB GO Begin transaction UPDATE teacher WITH(ROWLOCK) SET name='李红霞' where id=2; WAITFOR DELAY '000:00:020' select * from Teacher WHERE ID =1; If @@error>0 rollback transaction Else commit transaction Use TempDB GO Begin transaction UPDATE teacher WITH(ROWLOCK) SET name='王伟强' where id=1; WAITFOR DELAY '000:00:005' select * from Teacher WHERE ID =2; If @@error>0 rollback transaction Else commit transaction 事务(进程 ID 53)与另一个进程被死锁在 锁 资源上,并且已被选作死锁牺牲品。请重新...