Ik heb een NHibernate ICriteria waarbij ik een bepaalde instance van een entity wil ophalen.
Nu wil ik voorkomen dat andere threads / users die entity ook kunnen lezen, als die momenteel door een andere thread opgehaald is; maw, ik wil het record in de database, dat die bepaalde entity voorstelt, exclusief gaan locken.
Momenteel ziet mijn ICriteria er als volgt uit:
Zoals je kan zien, issue ik een 'UpgradeLock', wat resulteert in een SQL query die de updlock & rowlock locking hints gebruikt.
Dit voorkomt echter niet dat een andere user / connectie dat zelfde record kan lezen (het kan wel niet ge-updated worden tot wanneer het record weer vrijgegeven is).
Echter, ik wil dit nog een stapje verder; ik wil dat er een xlock locking hint gebruikt wordt, dus:
ipv
Maar, het lukt me niet om NHIbernate dit aan het verstand te krijgen.... Misschien zie ik iets over het hoofd ?
Ik kan natuurlijk ook de SQL query zelf gaan schrijven, en NHibernate die SQL query laten uitvoeren, maar dat vermijd ik liever.
Nu wil ik voorkomen dat andere threads / users die entity ook kunnen lezen, als die momenteel door een andere thread opgehaald is; maw, ik wil het record in de database, dat die bepaalde entity voorstelt, exclusief gaan locken.
Momenteel ziet mijn ICriteria er als volgt uit:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| With.Transaction (session, IsolationLevel.Serializable, delegate { ICriteria crit = session.CreateCriteria (typeof (TarificationProfile)); crit.SetLockMode (LockMode.Upgrade); crit.Add (Expression.Eq ("Id", tarificationProfileId)); TarificationProfile profile = crit.UniqueResult<TarificationProfile> (); nextNumber = profile.AttestCounter; profile.AttestCounter++; session.SaveOrUpdate (profile); }); |
Zoals je kan zien, issue ik een 'UpgradeLock', wat resulteert in een SQL query die de updlock & rowlock locking hints gebruikt.
Dit voorkomt echter niet dat een andere user / connectie dat zelfde record kan lezen (het kan wel niet ge-updated worden tot wanneer het record weer vrijgegeven is).
Echter, ik wil dit nog een stapje verder; ik wil dat er een xlock locking hint gebruikt wordt, dus:
code:
1
| SELECT ... FROM tabel with (xlock) |
ipv
code:
1
| SELECT ... FROM tabel with (updlock, rowlock) |
Maar, het lukt me niet om NHIbernate dit aan het verstand te krijgen.... Misschien zie ik iets over het hoofd ?
Ik kan natuurlijk ook de SQL query zelf gaan schrijven, en NHibernate die SQL query laten uitvoeren, maar dat vermijd ik liever.
https://fgheysels.github.io/