Twój nauczyciel odnosi się do Transakcji. Większość relacyjnych baz danych obsługuje transakcje, w tym MySQL*. Transakcje umożliwiają atomowe zachowanie wielu operacji CRUD. Oznacza to, że jeśli jedna operacja się nie powiedzie, baza danych cofnie wszystkie wprowadzone zmiany, tak jakby żadna z operacji nigdy nie wystąpiła.
Pamiętaj, że działają sekwencyjnie , nie jednocześnie. Jednak ponieważ są one atomowe, wydaje się, że wszystko działa w jednej operacji.
Aby uruchomić transakcję przy użyciu OleDbConnection
za pomocą C# możesz utworzyć transakcję z obiektu połączenia, zakładając, że jest on otwarty. Pamiętaj jednak, że w przeciwieństwie do procedury składowanej, musisz ręcznie zatwierdzić lub wycofać transakcję.
Zatwierdzenie transakcji sprawia, że ten zestaw operacji staje się „trwały” w bazie danych. Po zatwierdzeniu nie można go cofnąć.
Wycofanie ma miejsce, gdy zresetujesz bazę danych do stanu, który istniał przed rozpoczęciem transakcji.
Poniżej znajduje się przykład tworzenia transakcji z obiektu OleDbConnection wraz z wykonaniem zatwierdzenia i dwóch przypadków, w których możesz chcieć wycofać:
using(OleDbConnection con = DAL.GetConnection())
{
OleDbTransaction transaction = null;
try
{
con.Open();
transaction = con.BeginTransaction()
string queryString1 = //SQL string
OleDbCommand cmd1 = new OleDbCommand();
{
Connection = con,
CommandType = CommandType.Text,
CommandText = queryString1
};
string queryString2 = //SQL string
OleDbCommand cmd2 = new OleDbCommand();
{
Connection = con,
CommandType = CommandType.Text,
CommandText = queryString2
};
int num1 = cmd.ExecuteNonQuery();
int num2 = cmd.ExecuteNonQuery();
if (num1 == 0 || num2 == 0)
{
//We didn't expect something to return 0, lets roll back
transaction.Rollback();
//send error message
Response.Redirect("register.aspx?err=Error");
}
else
{
//everything seems good, lets commit the transaction!
transaction.Commit();
Session["id"] = MyDB.GetUserId(uname);
Response.Redirect("home.aspx");
}
}
catch(OleDbException ex)
{
try
{
//something bad happened, lets roll everything back
transaction.Rollback();
Response.Redirect("register.aspx?err=Error");
}
catch
{
//we don't really care about this catch statement
}
}
}
Oto artykuł MSDN na temat OleDbConnection.BeginTransaction
metoda z ogólnym przykładem podobnym do tego, który opublikowałem powyżej.
EDYTUJ :
*Jak @Clockwork-Muse wskazał w komentarzach, zdolność MySQL do obsługi transakcji zależy od używanego silnika. Istnieje wiele silników MySQL, ale dwa główne to InnoDB i MyISAM. InnoDB MOŻE obsługuje transakcje, ale MyISAM NIE .