Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Използване на SQL Server като механизъм за заключване на ресурси

Вие по същество описвате класически работен процес, базиран на опашка, и трябва да обмислите използването на истински опашка .

За целите на дискусията, ето как постигате това, което желаете:

  • изискване на конкретен ресурс: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%% стойност. Заключванията на приложения ви позволяват да отделите обхвата на „иска“ от транзакция, като поискате заключването на приложението в обхвата „сесия“, но след това трябва да освободите искането ръчно (заключванията на приложения с обхват „транзакция“ се освобождават по време на извършване) . Имайте предвид обаче, че има хиляди начини да се простреляте в крака с ключалки на приложения.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ST Съдържа колона География

  2. Неуспешно свързване към SQL сървър от Linux

  3. Списък на таблиците, използвани във всички съхранени процедури с името на схемата на SP

  4. Как да стартирате множество SQL команди в една SQL връзка?

  5. Създайте и изпълнете функция в SQL Server