Вие по същество описвате класически работен процес, базиран на опашка, и трябва да обмислите използването на истински опашка .
За целите на дискусията, ето как постигате това, което желаете:
- изискване на конкретен ресурс:
SELECT ... FROM resources WITH (UPDLOCK, ROWLOCK) WHERE key = @key
. Ще блокира, ако ресурсът вече е заявен. Използвайте изчакване за заключване, за да върнете изключение, ако ресурсът вече е заявен.key
трябва да бъдат индексирани и уникални. - следващ наличен ресурс:
SELECT ... FROM resources WITH (UPDLOCK, ROWLOCK, READPAST) ORDER BY <accessorder>
. Трябва да дефинирате ред, за да изразите предпочитанието на ресурсите (най-стари, с най-висок приоритет и т.н.) - освобождаване на заявен ресурс:
COMMIT
вашата транзакция.
Същността на проблема е използването на правилните съвети за заключване и този вид проблем изисква изрични съвети за заключване за разрешаване. UPDLOCK ще действа като заключване на „искове“. ROWLOCK създава правилната детайлност, предотвратявайки "оптимизиране" на сървъра до заключване на страница. READPAST ви позволява да пропускате заявени ресурси. Поставянето на UPDLOCK върху редовете ще заключи реда и ще ви позволи да го актуализирате по-късно, но ще предотврати други операции като обикновени SELECT-и, ангажирани за четене, които ще блокират заключения ред. Идеята е обаче, че така или иначе ще АКТУАЛИЗИРАТЕ реда, което ще постави неизбежно X заключване. Ако искате да запазите таблицата по-достъпна, можете да използвате заключвания на приложения вместо това, но е значително по-трудно да се направи правилно. Ще трябва да поискате заключване на приложение на дескриптор на низ за ресурса, като стойността на ключа или CHECKSUM
на ключа или е %%LOCKRES%%
стойност. Заключванията на приложения ви позволяват да отделите обхвата на „иска“ от транзакция, като поискате заключването на приложението в обхвата „сесия“, но след това трябва да освободите искането ръчно (заключванията на приложения с обхват „транзакция“ се освобождават по време на извършване) . Имайте предвид обаче, че има хиляди начини да се простреляте в крака с ключалки на приложения.