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

Разбиране на таймаутите на транзакциите

Опитайте се да погледнете на това по следния начин:

Дължината на транзакцията се определя само когато извикате trans.Complete() или излезете от обхвата на транзакцията. Вземете следния код:

using (var trans= new TransactionScope())
{
Threading.Sleep(99999);
trans.Complete()
}

Няма начин да хвърлите изключение за изчакване, докато сте в рутината за заспиване и няма да има смисъл, ако го направи. И така използването на изчакване на транзакция (поне по този начин) може да гарантира само, че ако транзакцията отнеме повече време от вашето изчакване, тя няма да бъде ангажирана.

Ако просто изпълнявате една заявка (за която няма да знам за какво използвате транзакциите), тогава можете да зададете времето за изчакване на заявката/командата (или както го наричате). IIRC, вашата заявка ще се върне веднага след изтичане на времето за изчакване.

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

РЕДАКТИРАНЕ:Можете да опитате:

  • Създаване на вашата транзакция в различна нишка и след това изчакване тя да завърши (използване на Thread.Join(timeout)) на вашата основна нишка (използвана от извикването на уеб услугата). Така че, ако не приключи преди времето за изчакване, което сте посочили, можете да спрете да чакате и да върнете грешка при изчакване (не забравяйте да сигнализирате на другата нишка да прекрати транзакцията).
  • Ако приемем, че изпълнявате само SQL заявки в тези транзакции, можете да използвате ключовата дума „НАЧАЛО НА ТРАНЗАКЦИЯ“, за да посочите транзакцията в sql скрипта (наистина хакерско). След това можете просто да посочите времето за изчакване на командата и да изпълните всичко това в един ред код. Но тогава това изисква да преместите всичко, което правите вътре в транзакцията, в sql скрипт, което може или не може да е възможно за вас... и не е чисто.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Най-добрият начин да получите PK Guid за вмъкнат ред

  2. Как да получите OBJECT_NAME() от различна база данни в SQL Server

  3. Резета на SQL Server и тяхната индикация за проблеми с производителността

  4. Планове за SQL Server:разлика между сканиране на индекс / търсене на индекс

  5. Подзаявка, използваща Exists 1 или Exists *