Geachte heren van GoT,
Samen met mijn stagebegeleider (van het bedrijf) loop ik al een aantal tegen een probleem aan met betrekking tot de combinatie Dapper, Task's en SqlTransaction's.
Het probleem is als volgt (bij de UnitTests): Als eerst worden er via drie methodes ondere andere eerst twee insert-query's uitgevoerd. Vervolgens worden op die twee ingevoegde items een update uitgevoerd. Dit gebeurt allemaal met behulp van de SqlTransaction en Dapper.
Daarna moeten deze rijen verder worden verwerkt wat asynchroon gebeurt met behulp van een Task. In deze task wordt ook weer via een SqlTransaction (met als IsolationLevel ReadCommited) een update met een query uitgevoerd.
Het gebeuren van het uitvoeren van de query gebeurt met de volgende "boilerplate":
Het probleem ligt er nu bij dat er iets fout gaat bij de taak. Alle query's van de eerste drie methodes worden correct uitgevoerd en kloppen ook als ik een select uitvoer op de betreffende tabellen.
Hierna wordt de Task afgevuurd. Dit bestaat uit twee methodes:
Ondanks het feit dat die andere drie methodes eerst worden uitgevoerd en dan deze task, wordt er niks gedaan met de al ingeschoten rijen. Dit zou wel moeten aangezien ze wel aan de where, waar de task op basis van update, voldoen.
De casussen waar het wel lukt zijn als volgt:
1. Eerst die drie methodes uitvoeren. Na even wachten die taak uitvoeren. (dus zeg maar als twee aparte unittests)
2. Alles in 1 unittest, maar met een breakpoint op de return. Wel even een aantal seconden wachten voordat je verder gaat bij de breakpoint.
Zijn er toevallig hier knappe koppen die hier iets op weten? Want het zou gewoon in één unit test moeten kunnen naar onze mening.
Samen met mijn stagebegeleider (van het bedrijf) loop ik al een aantal tegen een probleem aan met betrekking tot de combinatie Dapper, Task's en SqlTransaction's.
Het probleem is als volgt (bij de UnitTests): Als eerst worden er via drie methodes ondere andere eerst twee insert-query's uitgevoerd. Vervolgens worden op die twee ingevoegde items een update uitgevoerd. Dit gebeurt allemaal met behulp van de SqlTransaction en Dapper.
Daarna moeten deze rijen verder worden verwerkt wat asynchroon gebeurt met behulp van een Task. In deze task wordt ook weer via een SqlTransaction (met als IsolationLevel ReadCommited) een update met een query uitgevoerd.
Het gebeuren van het uitvoeren van de query gebeurt met de volgende "boilerplate":
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
| try { SqlConnection conn = new SqlConnection(...); conn.Open (); string transName = "x"; SqlTransaction sqlTrans = conn.BeginTransaction(transName); string sqlQry = "insert/update/select"; try { conn.Query <type> (sqlQry, <object met waarden voor query>, sqlTrans); sqlTrans.Commit (); } catch (Exception ex) { sqlTrans.Rollback (transName); } finally { sqlTrans.Dispose(); } } catch (Exception exc) { throw; } |
Het probleem ligt er nu bij dat er iets fout gaat bij de taak. Alle query's van de eerste drie methodes worden correct uitgevoerd en kloppen ook als ik een select uitvoer op de betreffende tabellen.
Hierna wordt de Task afgevuurd. Dit bestaat uit twee methodes:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
| public Task<Result_Rb> startTask (int b, string d) { return Task.Factory.StartNew<Result_Rb>(OtherMethodOfSameClass, new { a = b, c = d }); } private Result_rb OtherMethodOfSameClass (dynamic bla) { // met o.a. inhoud van bovengenoemde boilerplate // let wel mbt SqlTransaction -> SqlTransaction sqlTrans = conn.BeginTransaction(System.Data.IsolationLevel.ReadCommitted, transName); } |
Ondanks het feit dat die andere drie methodes eerst worden uitgevoerd en dan deze task, wordt er niks gedaan met de al ingeschoten rijen. Dit zou wel moeten aangezien ze wel aan de where, waar de task op basis van update, voldoen.
De casussen waar het wel lukt zijn als volgt:
1. Eerst die drie methodes uitvoeren. Na even wachten die taak uitvoeren. (dus zeg maar als twee aparte unittests)
2. Alles in 1 unittest, maar met een breakpoint op de return. Wel even een aantal seconden wachten voordat je verder gaat bij de breakpoint.
Zijn er toevallig hier knappe koppen die hier iets op weten? Want het zou gewoon in één unit test moeten kunnen naar onze mening.
RobIII: Ik probeer als ik wil stoppen met mijn auto ook altijd de sigarettenaansteker, de airco, 3 radioknoppen en de binnenverlichting en dan de rem :P