Code:
Dim bsnEntity_1 As BsnEntity_1
Dim bsnEntity_2 As BsnEntity_2
Try
Using scope As New TransactionScope()
bsnEntity_1.InsertIntoTable_1(par1, par2, ...)
int count = bsnEntity_1.SelectFromTable_1()
bsnEntity_2.UpdateTable_2 (count)
...
scope.Complete()
End Using
catch ...
end try
Dim bsnEntity_1 As BsnEntity_1
Dim bsnEntity_2 As BsnEntity_2
Try
Using scope As New TransactionScope()
bsnEntity_1.InsertIntoTable_1(par1, par2, ...)
int count = bsnEntity_1.SelectFromTable_1()
bsnEntity_2.UpdateTable_2 (count)
...
scope.Complete()
End Using
catch ...
end try
Kao sto se vidi iz ovog koda, u okviru jednog TransactionScope-a, postoji (recimo) jedan Insert, jedan Select (koji selektuje redove iz tabele poslije insert-a u tu tabelu) i jedan update u drugu tabelu (koji koristi promenljivu count, dobijenu prethodnim select-om). Da napomenem, radi se o istoj (jednoj) bazi. Jos i to da navedem: baza je na Windows 2008R2 serveru.
NAPOMENA : Promenljive bsnEntity_1 i bsnEntity_2 su iz drugih dll-ova.
Sistem (aplikacija) je tako zamisljen da svaka metoda, iz drugih projekata (dll-ova), otvara konkeciju, odradi transakciju (insert, update, select, delete) i zatvori konekciju, tako da ne postoje dvije, istovremeno, otvorene konekcije. S druge strane, kao sto se iz primjera vidi, ne postoji JEDNA sql konekcija u ovom konceptu, u okviru koje se poziva TransactionScope, nego se svaka metoda stara o tome da otvori/zatvori konekciju (i taj kod je u drugim dll-ovima).
Problem: prvi poziv (bsnEntity_1.InsertIntoTable_1(par1, par2, ...)) prolazi (radi se o insert-u vece kolicine podataka i to potraje nekih 5-6 minuta). Ali, drugi poziv 'puca' i to prilikom otvaranja sql konekcije, uz outer exception: 'operation is not valid for the state of the transaction'. Inner exception javlja 'sqlconnection timeout' (puca, bukvalno, na 'konekcija.Open()').
Da pokusam da budem jos precizniji u opisu koda (odnosno, problema):
Code:
Dim bsnEntity_1 As BsnEntity_1
Dim bsnEntity_2 As BsnEntity_2
Try
Using scope As New TransactionScope()
bsnEntity_1.InsertIntoTable_1(par1, par2, ...)
'u gornjem pozivu se: otvara sql konekcija, pozove uskladistena procedura i zatvori sql konekcija
'sve funkcionise ispravno
int count = bsnEntity_1.SelectFromTable_1()
'i u gornjem pozivu se: otvara sql konekcija, pozove uskladistena procedura i zatvori sql konekcija
'program 'puca' prilikom otvaranja sql konekcije u okviru gornjeg poziva
'outer exception: 'operation is not valid for the state of the transaction'
'inner exception: 'sqlconnection timeout'
bsnEntity_2.UpdateTable_2 (count)
...
End Using
catch ...
end try
Dim bsnEntity_1 As BsnEntity_1
Dim bsnEntity_2 As BsnEntity_2
Try
Using scope As New TransactionScope()
bsnEntity_1.InsertIntoTable_1(par1, par2, ...)
'u gornjem pozivu se: otvara sql konekcija, pozove uskladistena procedura i zatvori sql konekcija
'sve funkcionise ispravno
int count = bsnEntity_1.SelectFromTable_1()
'i u gornjem pozivu se: otvara sql konekcija, pozove uskladistena procedura i zatvori sql konekcija
'program 'puca' prilikom otvaranja sql konekcije u okviru gornjeg poziva
'outer exception: 'operation is not valid for the state of the transaction'
'inner exception: 'sqlconnection timeout'
bsnEntity_2.UpdateTable_2 (count)
...
End Using
catch ...
end try
Moze li neko da mi pomogne 'sta ne valja u ovoj koncepciji' ?
Na google-u ima dosta prijava problema na ovu temu (da je tako krstim: 'handling multiple sql connections in one transaction scope'), ali ja nisam uspio da nadjem rjesenje za svoj problem. Odnosno, rjesenje je da se sve drzi u okviru jedne sql konekcije. To bi mi znatno poremetilo postojecu koncepciju (kao sto sam napisao, svaki metod vodi racuna o otvaranju/zatvaranju konekcije) ...
Ili je, mozda, TransactionScope korektno primijenjen, a otvaranje sql konekcije 'puca' zbog nekog drugog razloga ?
Nadam se da sam korektno (percizno) opisao problem - zahvalan za svaki prijedlog, pomoc, sugestiju ...
Programming is fun, but writing good software is hard ...