Saya memiliki persyaratan untuk membuat prosedur tersimpan yang mengemulasi urutan TSQL. Itu selalu memberikan peningkatan nilai integer yang berbeda pada setiap panggilan. Selain itu, jika bilangan bulat dilewatkan di dalamnya harus mengembalikan nilai itu jika tidak pernah ada hasil yang lebih besar atau bilangan bulat tertinggi berikutnya yang tersedia. Tak perlu dikatakan bahwa ada beberapa klien yang memanggil SP ini pada saat yang sama.
Diberikan tabel MetaInfo dengan kolom MetaKey varchar (max) dan MeatValueLong bigInt. Diharapkan baris dengan MetaKey 'Internal-ID-Last' akan berisi nilai tertinggi terakhir yang diberikan. Saya membuat prosedur tersimpan berikut:
CREATE PROCEDURE [dbo].[uspGetNextID]
(
@inID bigInt
)
AS
BEGIN
SET NOCOUNT ON;
BEGIN TRANSACTION
UPDATE MetaInfo WITH (ROWLOCK)
SET MetaValueLong = CASE
WHEN ISNULL(MetaValueLong,0) > @inID THEN MetaValueLong+1
ELSE @inID+1
END
WHERE MetaKey = 'Internal-ID-Last'
SELECT MetaValueLong
FROM MetaInfo
WHERE MetaKey = 'Internal-ID-Last'
COMMIT TRANSACTION
END
Pertanyaan saya sederhana, apakah prosedur tersimpan ini berfungsi seperti yang diharapkan (semua penelepon akan diberikan hasil yang unik)?
sumber
Jawaban:
Saya sudah pernah melihat dan MS sendiri menawarkan solusi tanpa kunci
http://blogs.msdn.com/b/sqlcat/archive/2006/04/10/sql-server- berikutnyaence-number.aspx
Ini adalah pembaruan sederhana tanpa petunjuk kunci, tetapi mereka mengatakan itu mengunci / deadlock.
Tidak banyak tentang SO tentang ini juga.
Saya akan cenderung menambahkan UPDLOCK ke ROWLOCK Anda (sesuai "tabel sebagai antrian" (SO) tetapi tanpa READPAST). Ini akan meningkatkan isolasi jika proses kedua mulai membaca.
Namun, faktanya semua proses Anda ingin membaca / menulis baris yang sama membuat saya menebak sendiri. READPAST memungkinkan konkurensi yang aman tetapi dalam kasus ini tidak berguna.
Catatan: Anda dapat menggunakan klausa OUTPUT alih-alih memilih ke-2 maka Anda tidak perlu transaksi.
HTH ...
sumber
Hal-hal berikut hilang
Ya, itu harus memenuhi kondisi Anda. Setelah situasi seperti itu terjadi dalam transaksi, itu menciptakan beberapa contoh dan selanjutnya, semua penelepon akan diberikan hasil yang unik
sumber
Solusi yang lebih scalable yang tidak memerlukan serialisasi adalah ini:
sumber