Uproszczony zapis using zamyka się wcześniej i nie commituje zmian do bazy

0

Witam.
Natknąłem się na pewien problem, który chyba nie powinien wystąpić. Korzystając z uproszczonego using'a

using var t = db.BeginTransaction();
// ... dużo update'ów
t.Commit();

Nie aktualizuje danych, przechodzi przez całą metodę, nie ma żadnego wyjatku.

Gdy tylko zmieniłem na

using (var t = db.BeginTransaction())
{
  // ... dużo update'ów
  t.Commit();
}

Wszystko działa bez problemów i się aktualizuje. Czy tak powinno być? Coś robię źle?

0

Pokaż cały kod lub wrzuć tu najprostszy kod, który zawiera ten błąd.
Możesz też użyć profilera i zobaczyć, kiedy do bazy danych idzie COMMIT TRANSACTION - ale stawiam dolary przeciw orzechom, że zrobiłeś coś, co nie wykonuje commita, aktualizujesz dane nie w tej bazie, źle zmieniasz dane lub nie wykonujesz SaveChanges.

0

To jest Dapper nie EntityFramework. Baza jest jedna. Różnica w działaniu tylko między uproszczonym using'iem, a "normalnym".

// połączenie do bazy też jest z wykorzystaniem uproszczenia
using var db = _context.CreateConnection();

// w przypadku korzystania z transakcji w Dapperze trzeba otworzyć połączenie do bazy
db.Open();

// otwieram transakcję korzystając z uproszczonego using'a
using var t = db.BeginTransaction();

// ... Aktualizacja dokumentu i jego podobiektów. Masa ifów i foreachów

// Przykłady operacji
if (dokEwidencja.NagEwidencjiVat is not null)
  await db.ExecuteAsync(_queries.UpdateNagEwidencjiVatQuery, dokEwidencja.NagEwidencjiVat, t);

if (dokEwidencja.OpisAnalityczny is not null)
{
  foreach (var opis in dokEwidencja.OpisAnalityczny)
  {
    await db.ExecuteAsync(_queries.UpdateOpisAnalitycznyQuery, opis, t);

    if (opis.Cechy is not null)
    {
      foreach (var feature in opis.Cechy)
      {
        await db.ExecuteAsync(_queries.UpdateFeaturesQuery, feature, t);
      }
    }
  }
}

// na samym końcu
t.Commit();
0

A przejechałeś debuggerem po kodzie? Commit na końcu jest wykonywany? Dane do zmiany są != null?

0

Oczywiście, że przejechałem. Wszystko się wykonuje, nie ma żadnych nulli, bo wszystko jest sprawdzane. Wrzuciłem tutaj uproszczenie, bo tego jest bardzo dużo. Jedyne co może coś nakierować to jak zrobiłem

try { t.Commit(); }
catch(Exception ex) { t.Rollback(); }

To debugger w miejscu gdzie jest t.Rollback(); pokazał IsolationLevel Exception. Tego "błędu" nie ma jeśli zrobie to pełnoprawnie z nawiasami klamrowymi.

0

A ten drugi using to nie powinien mieć czasem { } ?

0

No właśnie z {} działa i comminuje zmiany do bazy, bez nie. Czyli ja nie mogę mieć dwóch takich, uproszczonych using'ów?

0

czyli jak rozwijasz debuggerem t to IsolationLevel rzuca wyjątkiem w przypadku bez klamerek? jaki wyjątek?

0

Tak to wygląda.

isolation_error.png

1 użytkowników online, w tym zalogowanych: 0, gości: 1