1.SQL Server查詢中WITH(NOLOCK)
SELECT語句中加上WITH(NOLOCK)為解決阻塞死鎖。
處理資料庫死鎖異常查詢的一種方式是使用NOLOCK 或 READPAST。
◊ NOLOCK:可能顯示沒有提交事務的資料
◊ READPAST:不顯示被事務鎖住資料
1.1 沒有提交的事務,NOLOCK 和 READPAST處理的策略
CREATE TABLE [dbo].[Role]( [ID] [int] IDENTITY(1,1) NOT NULL, [RoleName] [nvarchar](100) NOT NULL, CONSTRAINT [PK_Role] PRIMARY KEY CLUSTERED ( [ID] ASC ))
BEGIN TRANSACTION INSERT INTO [dbo].[Role](RoleName) VALUES ('教師')
1.2 對被鎖住的記錄,NOLOCK 和 READPAST處理的策略
INSERT INTO [dbo].[Role](RoleName) VALUES ('教師'),('學生')
BEGIN TRANSACTION UPDATE [dbo].[Role] SET [RoleName] = 'Teacher' WHERE ID = 1
2. EntityFramework查詢WITH(NOLOCK)
using System; using System.Transactions; namespace Libing.App { class Program { static void Main(string[] args) { using (var context = new LibingContext()) { using (var ts = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions { IsolationLevel = IsolationLevel.ReadUncommitted })) { var role = context.Set<Role>().Find(1); } } } } }
使用TransactionScope來避免查詢對於它所讀取的表的鎖定。