Érdekes hibába futottam bele pár hete:
Issue with System.Transactions, SqlConnection and Timeout
How to Use System.Data with System.Transactions and Maintain Atomicity and Data Consistency
Szituáció: Egy folyamat a new TransactionScope(..)- hívással megnyitja a tranzakciót, majd folyamat elkezdi a scope-on belül az SQL Server adatbázisokat matatni.
Abban az esetben, ha a matatás folyamat lassú, és nem jut el tranzakció timeout időn belül a TransactionScope Complete() hívásáig, akkor:
- a timeout leteltekor az SqlConnection – transaction kötés megszűnik,
- a kapcsolat tranzakció nélkül lóg a levegőben, auto commit módban került, vagyis ezután minden rajta keresztül végzett művelet commitolva lesz,
- a matatás végeztekor a folyamat meghívja a TransactionScope Complete() hívást, ami Exception-nel jelzi, hogy timeout van, és visszavonja timeout letelte előtt végzett műveleteket.
Következmény: a timeout után végzett módosítások nem kerülnek visszavonásra.
A hibát észrevették, javították, de úgy, hogy a javított viselkedést külön kell aktiválni a connection string-ben megadott transaction binding=explicit Unbind; paraméterrel.
Mely CLR verziókban támogatott:
| Version | transaction binding supported? | Comment |
| 2.0.50727.42 | - | RTM |
| 2.0.50727.832 | - | KB928365 – (RTM után, de még SP1 előtt) |
| 2.0.50727.1433 | + | .NET 2.0 SP1 |
| 2.0.50727.3053 | + | .NET 2.0 SP2 |
Illetve Florin Lazar szerint:
“Hopefully, the default behavior will change to explicit unbind in the future releases (non-SP) of .Net Framework.”
Mi a tranzakció timeout értéke?
A Machine.Config-ban a configuration/system.transactions/machineSettings elemnél a maxTimeout a gépen belül beállítható max timeout-ot adja meg, ami alapesetben 10 perc.
Ezen belül mozoghat alkalmazásonként az App.Config-ban a configuration/system.transactions/defaultSettings elemnél a timeout paraméter, mely alapesetben 1 perc.
Tehát alapértelmezett esetben 1 perc .
