Jeśli mam funkcję, która edytuje bazę danych w moim serwisie internetowym, chcę, aby jeden wątek był uruchamiany za jednym razem, jeśli próbują edytować ten sam wiersz.Zablokować tylko, jeśli wartość jest taka sama?
void EditCheck(long checkid)
{
if (isCheckCosed)
throw new Exception("check is already closed");
//do stuff
//after i edit my check i want to close it.
CloseCheck();
}
wiem, że może zablokować całą funkcję, ale wtedy stracę ponoszeniu ponieważ jej prawie nigdy, że różne wątki spróbuje edytować ten sam czek.
Czy istnieje sposób na zablokowanie innych wątków z tym samym checkidem?
UPDATE
użyć OleDbConnection
i MySqlConnection
OleDbCommand oleDbCommand = AccessTrans != null ?
new OleDbCommand(sql, AccessConn, AccessTrans) : new OleDbCommand(sql, AccessConn);
oleDbCommand.ExecuteNonQuery();
taka sama funkcja MySqlCommand
a potem jus użyciu normalnych wkładkę i SQL UPDATE poleceń. i transakcja jest sprawdzana, czy jest obecna, czy nie. więc ta funkcja działa, jeśli chcesz transakcji, lub nie, w funkcji wyższego poziomu.
do odczytu z bazy danych będę wypełniać DataTable
OleDbCommand oleDbCommand = AccessTrans != null ? new OleDbCommand(sql, AccessConn, AccessTrans) : new OleDbCommand(sql, AccessConn);
OleDbDataAdapter dAdapter = new OleDbDataAdapter();
dAdapter.SelectCommand = oleDbCommand;
dAdapter.Fill(dTable);
return dTable;
Czy nie powinno to być obsługiwane na końcu bazy danych? Czy masz problem lub czy jest to oparte na założeniach? –
W jaki sposób jest zapisywany dostęp do danych? Jeśli używasz EF, może to pomóc: http: //blogs.msdn.com/b/alexj/archive/2009/05/20/tip-19-how-to-use-optimistic-concrency-in-the- entity-framework.aspx – Lev
Czy możesz pokazać, w jaki sposób uzyskujesz dostęp do bazy danych, istnieją dobre narzędzia wbudowane w wiele metod dostępu do danych w celu rozwiązania tego problemu (każde rozwiązanie działające tylko po stronie klienta działałoby tylko wtedy, gdy tylko jeden klient kiedykolwiek łączy się z bazą danych Jeśli dwie kopie twojego programu wywołają "EditCheck" dla tego samego "checkid", bieżące odpowiedzi nie zadziałają) –