Saat meneliti penggunaan Petunjuk Tabel , saya menemukan dua pertanyaan ini:
Jawaban untuk kedua pertanyaan tersebut mengatakan bahwa saat menggunakan (UPDLOCK, HOLDLOCK)
, proses lain tidak akan dapat membaca data di tabel itu, tetapi saya tidak melihatnya. Untuk mengujinya, saya membuat tabel dan memulai dua jendela SSMS. Dari jendela pertama, saya menjalankan transaksi yang dipilih dari tabel menggunakan berbagai petunjuk tabel. Saat transaksi sedang berjalan, dari jendela kedua saya menjalankan berbagai pernyataan untuk melihat mana yang akan diblokir.
Tabel uji:
CREATE TABLE [dbo].[Test](
[ID] [int] IDENTITY(1,1) NOT NULL,
[Value] [nvarchar](50) NULL,
CONSTRAINT [PK_Test] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
Dari SSMS Jendela 1:
BEGIN TRANSACTION
SELECT * FROM dbo.Test WITH (UPDLOCK, HOLDLOCK)
WAITFOR DELAY '00:00:10'
COMMIT TRANSACTION
Dari SSMS Jendela 2 (menjalankan salah satu dari berikut ini):
SELECT * FROM dbo.Test
INSERT dbo.Test(Value) VALUES ('bar')
UPDATE dbo.Test SET Value = 'baz' WHERE Value = 'bar'
DELETE dbo.Test WHERE Value= 'baz'
Pengaruh petunjuk tabel yang berbeda pada pernyataan yang dijalankan di Jendela 2:
(UPDLOCK) (HOLDLOCK) (UPDLOCK, HOLDLOCK) (TABLOCKX)
---------------------------------------------------------------------------
SELECT not blocked not blocked not blocked blocked
INSERT not blocked blocked blocked blocked
UPDATE blocked blocked blocked blocked
DELETE blocked blocked blocked blocked
Apakah saya salah memahami jawaban yang diberikan dalam pertanyaan tersebut, atau membuat kesalahan dalam pengujian saya? Jika tidak, mengapa Anda menggunakan (UPDLOCK, HOLDLOCK)
vs. (HOLDLOCK)
sendirian?
Penjelasan lebih lanjut tentang apa yang saya coba capai:
Saya ingin memilih baris dari tabel dan mencegah data dalam tabel itu dimodifikasi saat saya memprosesnya. Saya tidak mengubah data itu, dan ingin mengizinkan terjadinya pembacaan.
Jawaban ini dengan jelas mengatakan bahwa (UPDLOCK, HOLDLOCK)
akan memblokir pembacaan (bukan yang saya inginkan). Komentar pada jawaban ini menyiratkan bahwa hal HOLDLOCK
itu mencegah pembacaan. Untuk mencoba dan lebih memahami efek petunjuk tabel dan melihat apakah UPDLOCK
sendirian akan melakukan apa yang saya inginkan, saya melakukan percobaan di atas dan mendapatkan hasil yang bertentangan dengan jawaban tersebut.
Saat ini, saya percaya bahwa (HOLDLOCK)
itulah yang harus saya gunakan, tetapi saya khawatir bahwa saya mungkin telah melakukan kesalahan atau melewatkan sesuatu yang akan kembali menggigit saya di masa depan, oleh karena itu pertanyaan ini.
sumber
UPDLOCK digunakan saat Anda ingin mengunci baris atau baris selama pernyataan pilih untuk pernyataan pembaruan di masa mendatang. Pembaruan di masa mendatang mungkin merupakan pernyataan berikutnya dalam transaksi.
Sesi lain masih dapat melihat data. Mereka tidak bisa mendapatkan kunci yang tidak cocok dengan UPDLOCK dan / atau HOLDLOCK.
Anda menggunakan UPDLOCK saat Anda ingin mencegah sesi lain mengubah baris yang telah Anda kunci. Ini membatasi kemampuan mereka untuk memperbarui atau menghapus baris yang terkunci.
Anda menggunakan HOLDLOCK saat Anda ingin mencegah sesi lain mengubah data apa pun yang Anda lihat. Ini membatasi kemampuan mereka untuk memasukkan, memperbarui, atau menghapus baris yang telah Anda kunci. Ini memungkinkan Anda menjalankan kueri lagi dan melihat hasil yang sama.
sumber
(UPDLOCK,HOLDLOCK)
blok dibaca, dan adakah alasan untuk menggunakan(UPDLOCK,HOLDLOCK)
alih-alih hanya(HOLDLOCK)
?