Folytatásként mutatok egy második nekifutást az előző rész problémájára. Ebben elkerültem a felesleges if exists-et, amely miatt egyszerűbb lett az eljárás. Azt vártam egyébként, hogy gyorsabb is lesz, de nem, hisz most is kétszer futunk neki a táblának.
create proc dbo.UpsertClient2 @id int, @name nvarchar(100) as set xact_abort on begin transaction update dbo.Client with (serializable) set name = @name where id = @id if (@@rowcount = 0) insert dbo.Client (id, name) values (@id, @name) commit
Az előző megoldáshoz képest itt nem kellett updlock hint, hisz az update elve azt használ az olvasási fázisban (másként a sima update-ek is állandóan deadlockolnának, pont ezért van külön update lock).
A serializable az előző részben részletezett okok miatt kell, azaz meg kell fogni az update-elendő kulcsot, ha létezik a sor, ha nem, hogy a következő insertnek “meg legyen ágyazva a hely”.
Could you hire me? Contact me if you like what I’ve done in this article and think I can create value for your company with my skills.