আমি এসকিউএল সার্ভারে একটি নির্বাচন পেয়েছি যা পুরো টেবিলটিকে লক করে দেয়।
এখানে সেটআপ স্ক্রিপ্ট (নিশ্চিত করুন যে আপনি কোনও কিছুই ওভাররাইট না করেছেন)
USE [master]
GO
IF EXISTS(SELECT 1 FROM sys.databases d WHERE d.name = 'LockingTestDB')
DROP DATABASE LockingTestDB
GO
CREATE DATABASE LockingTestDB
GO
USE [LockingTestDB]
GO
IF EXISTS(SELECT 1 FROM sys.tables t WHERE t.name = 'LockingTestTable')
DROP TABLE LockingTestTable
GO
CREATE TABLE LockingTestTable (
Id int IDENTITY(1, 1),
Name varchar(100),
PRIMARY KEY CLUSTERED (Id)
)
GO
INSERT INTO LockingTestTable(Name) VALUES ('1')
INSERT INTO LockingTestTable(Name) VALUES ('2')
GO
একটি নতুন ক্যোয়ারী উইন্ডোটি খুলুন এবং নিম্নলিখিত লেনদেনটি চালান (যার এতে অপেক্ষা রয়েছে):
USE [LockingTestDB]
GO
BEGIN TRANSACTION
SELECT * FROM LockingTestTable t WITH (UPDLOCK, ROWLOCK) WHERE t.Name = '1'
WAITFOR DELAY '00:01:00'
COMMIT TRANSACTION
--ROLLBACK
GO
USE [master]
GO
এবং অন্য একটি যা চলবে (তারা একই সাথে চালাবেন তা নিশ্চিত করুন):
USE [LockingTestDB]
GO
SELECT * FROM LockingTestTable t WITH (UPDLOCK, ROWLOCK) WHERE t.Name = '2'
USE [master]
GO
আপনি লক্ষ্য করবেন যে দ্বিতীয় ক্যোয়ারী প্রথম দ্বারা অবরুদ্ধ হয়ে যাবে। প্রথম জিজ্ঞাসা বন্ধ করুন এবং রোলব্যাকটি কার্যকর করুন এবং দ্বিতীয়টি সম্পূর্ণ হবে।
এটি কেন ঘটছে?
PS: নামের সাথে একটি ক্লাস্টারবিহীন সূচক (সম্পূর্ণ কভারেজ সহ) যুক্ত করা এটি ঠিক করবে:
USE [LockingTestDB]
GO
CREATE NONCLUSTERED INDEX [IX_Name] ON [dbo].[LockingTestTable]
(
[Name] ASC
)
INCLUDE ( [Id]) WITH (STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
আবার কেন?