EntityFramework優化:查詢WITH(NOLOCK)

libingql發表於2018-05-17

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來避免查詢對於它所讀取的表的鎖定。

相關文章