sql >> Databáze >  >> RDS >> Sqlserver

Porozumění časovým limitům transakčního rozsahu

Zkuste se na to podívat takto:

Délka transakce je určena pouze tehdy, když zavoláte trans.Complete() nebo opustíte rozsah transakce. Vezměte následující kód:

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

Neexistuje způsob, jak vyvolat výjimku časového limitu, když je uvnitř spánkové rutiny, a nedávalo by to smysl, kdyby tomu tak bylo. A tak použití časových limitů transakcí (alespoň tímto způsobem) může zaručit pouze to, že pokud transakce trvá déle než váš časový limit, nebude potvrzena.

Pokud právě provádíte jeden dotaz (o kterém nevím, k čemu transakce používáte), můžete nastavit časový limit dotazu/příkazu (nebo jak to nazvat). IIRC, váš dotaz se vrátí okamžitě po vypršení časového limitu.

Dalším způsobem by bylo nastavit časový limit požadavku webové služby a pouze předpokládat, že webové službě trvá odpověď příliš dlouho kvůli tomu, co bylo uvnitř vaší transakce.

EDIT:Můžete zkusit:

  • Vytvořte svou transakci v jiném vláknu a poté počkejte na její dokončení (pomocí Thread.Join(timeout)) ve vašem hlavním vláknu (které používá volání webové služby). Pokud se tedy neukončí před uplynutím zadaného časového limitu, můžete přestat čekat a vrátit chybu časového limitu (nezapomeňte dát druhému vláknu signál, aby transakci zrušil).
  • Za předpokladu, že v rámci těchto transakcí provádíte pouze dotazy SQL, můžete použít klíčové slovo "BEGIN TRANSACTION" pro specifikaci transakce ve skriptu SQL (skutečně hackery). Pak byste mohli jen zadat časový limit příkazu a provést toto vše v jediném řádku kódu. To ale vyžaduje, abyste přesunuli vše, co děláte v rámci transakce, do skriptu SQL, což pro vás může, ale nemusí být možné... a není to čisté.



  1. Vložte více řádků do jednoho sloupce

  2. MySQL:Zkontrolujte, zda uživatel existuje, a zahoďte jej

  3. Jak používat regexp ve sqlite

  4. Převod řetězce na typ mySql DECIMAL