Witam, mam problem z prawidłową realizacją tranzakcji. Opisanie problemu wydaje się być nieco trudne, ale spróbuję zrobić to najlepiej jak potrafię.
Tablica Uzytkownik zawiera klucz główny na polu id_uzytkownika oraz UNIQUE na polu login_uzytkownika, w zabezpieczenia przed identycznym loginem w bazie danych.
Starałem się zaprojektować jak najlepiej tabelę, tak aby pozwalała na archiwizowanie danych o użytkownikach, w związku z czym jedno z pól tablicy zawiera ewentualny identyfikator aktualniejszej wersji konta. Aby zachować wszystkie informacje o wcześniejszych danych łącznie z loginem chciałem użyć tranzakcji w celu zespolenia kilku poleceń. Przede wszystkim zmieniam login użytkownika według wzoru: '#' + id_uzytkownika + '#' + login, tak aby nie UNIQUE nie zgłosiło wyjątku. Pole login_uzytkownika ma długość 30 znaków, natomiast aplikacja blokuje do długości 20, przez co w bazie mogę przechowywać w najgorszym wypadku do #99999999#. Dalej chciałem wprowadzić konto do bazy z nowymi danymi, a na koniec wprowadzić id_nast_uzytkownika czyli identyfikator aktualizacji konta. Problem pojawia się w momencie gdy dodaję nowy wpis, bo tranzakcja tak jakby nie wysłała jeszcze danych do bazy i widniał w niej używany już login. Czy muszę skożystać z poziomu tranzakcji czy jeszcze coś innego?
try
{
connection.Open();
transaction = connection.BeginTransaction("Edycja konta użytkownika");
commandUpdateFirst.Transaction = transaction;
commandInsert.Transaction = transaction;
commandUpdateSecond.Transaction = transaction;
commandUpdateFirst.Parameters.Clear();
commandUpdateFirst.Parameters.AddWithValue("@id_uzytkownika", id_uzytkownika);
commandUpdateFirst.ExecuteNonQuery();
commandInsert.Parameters.Clear();
commandInsert.Parameters.AddWithValue("@id_uzytkownika", id_uzytkownika);
commandInsert.Parameters.AddWithValue("@nazwa_uzytkownika", nazwa_uzykownika);
commandInsert.Parameters.AddWithValue("@login_uzytkownika", login_uzytkownika);
commandInsert.Parameters.AddWithValue("@tel_uzytkownika", tel_uzytkownika);
commandInsert.Parameters.AddWithValue("@email_uzytkownika", email_uzytkownika);
commandInsert.Parameters.AddWithValue("@data_utwo_uzytkownika", now);
commandInsert.Parameters.AddWithValue("@id_zalo_uzytkownika", UserLogin.id);
commandInsert.ExecuteNonQuery();
int id_nast_uzytkownika = Convert.ToInt32(commandInsert.ExecuteScalar());
commandUpdateSecond.Parameters.Clear();
commandUpdateSecond.Parameters.AddWithValue("@id_uzytkownika", id_uzytkownika);
commandUpdateSecond.Parameters.AddWithValue("@id_nast_uzytkownika", id_nast_uzytkownika);
commandUpdateSecond.ExecuteNonQuery();
transaction.Commit();
}