Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Blokowanie rekordów.
Forum PHP.pl > Forum > Bazy danych > MySQL
Toudinius
Witam.

Jak technicznie można zablokwowć rekord w tabeli, w którym akurat dokonujemy modyfikacji. Chodzi mi czy jest to jakoś możliwe czy też da się coś takiego zrobić - to jak ? - prosiłbym o wskazówki. Ideologią jest wyelminowanie takiego przypadku gdy dwóch użytkowników próbuje dokonać modyfikcji tego rekordu.

Czy mając bazę danych opartą na relacjach można w php zdać do bazy MySQL jedno zapytanie odwołujące się swoją składnią do np 3 tabel połączonych relacjami.
AcidBurnt
chyba technicznie sie nie da, ale mozna zrobic takie cus, przynajmniej tylko taki mi wpadl pomysl do glowy, prtzed kazdym zapytaniem wykonujesz zapytanie do bay, i ustawia wartosc w tabeli blokalda na 1, po wykananiu zapytania na 0, i jesli jakies zapytanie chce sie wykonan a blokada jest na 1 to nie idze dalje..

a co do 2 to na formum byl juz ten temat poruszany,. poszukaj smile.gif
BzikOS
php => Bazy danych
DeyV
Cytat
6.7.2 LOCK TABLES/UNLOCK TABLES Syntax

LOCK TABLES tbl_name [AS alias] {READ | [READ LOCAL] | [LOW_PRIORITY] WRITE}
[, tbl_name {READ | [LOW_PRIORITY] WRITE} ...]
...
UNLOCK TABLES


LOCK TABLES locks tables for the current thread. UNLOCK TABLES releases any locks held by the current thread. All tables that are locked by the current thread are automatically unlocked when the thread issues another LOCK TABLES, or when the connection to the server is closed.
uboottd
no jest to pewna armata winksmiley.jpg
polecam poczytanie tez o innodb w MySQL-u, transakcjach i skladni select .... for update
maragoska
Witam wszytskich!

Odgrzebuję dość stary temat. Niestety potrzebuję pomocy w zakresie blokowania bazy danych na poziomie wierszy.
Zrobiłem coś takiego:
1. Założyłem tabelę typu innodb.
2. Zasiliłem ją około 1500 rekordami.
3. Otworzyłem dwie niezależne sesje.
4. Na każdej wykonałem polecenie
  1. SET AUTOCOMMIT=0;

5. Na każdej sesji wykonuję
  1. SELECT ... FOR UPDATE;
na osobnych wieszach

Problem: Druga sesja czeka na wykonanie COMMIT; w pierszej.

Wniosek: Blokowana jest cała tablica, a nie jak należało się spodziewać tylko wybrane wiersze.

Test przeprowadziłem na wersji 4.1.7 dla Windows i 4.0.16 dla Linux-a.

Może ktoś z forumowiczów spotkał się z podobnym problemem i wie jak go rowiązać?

Pozdrawiam i wdzięczny będę za pomoc.
yaroo_s
Ja mam taką prośba czy może ktos w miare prosto wytłumaczyż jak powinno wyglądać te blokowanie rekordów?? Bo do tej pory nie złapłam a jest mi to dosc potrzebne.

U mnie sytacja wygląda tak: kilku uzytkowników chce w tym samym czasie wykonac opracje select na danych - później kod php cos tam z nimi miesza a i następnie zwraca poprzez UPDATE do bazy. zalezy mi by nikt nie mógł nic zrobic z danym rekordem dopuki pierwszy uzytkownik nie zaaktualizuje danych włsne poprzez UPDATE?

czy da sie cos takiego rozwiązać?
i jak to zrobic?
może ktoś ma link do jakiegos dobrego manuala o tym (tylko prosze polskiego, bo czasami tekst techniczny po angielsku jest trudny - a wiadomo ze każde słow sie liczy..)
maragoska
Witam!

Po pierwsze należy utworzyć odpowiedni typ tablicy. W MySQL jest to np. innoDB.

Domyślnie baza ma ustawiona tryb trnasakcji niejawnych, czyli np. po wykonaniu UPDATE.... transakcja (tzn. wynik wykonania tego polecenia) jest zatwierdzany.

Jak piszesz wyżej chodzi Tobie o zgrupowanie kilku operacji. W tym celu musisz wyłączyć ten tryb poleceniem SET AUTOCOMMIT=0.
Od tej pory nalezy używać poleceń BEGIN WORK, COMMIT i ROLLBACK.

Zalezy Tobie na odczytaniu wartości z wierszy, zmodyfikowanie ich i zapisanie, tak aby nikt inny nie mógł tego zrobić.

Po BEGIN WORK należy użyć polecenia SELECT ..... FOR UPDATE, które zablokuje wybrane wiersze.
Dalej to co chcesz zrobić z tymi wierszami i na koniec COMMIT lub ROLLBACK zaleznie od tego czy wystąpiły błędy, czy nie.

Tak wygląda to w skrócie. Wersja darmowa MySQL blokuje zasoby na poziomie tablicy. Jeśli chcesz blokować na poziomie wiersza, to musisz mieć wersję komercyjną. Taką informację wyczytałem jakiś czas temu na stronacy MySQL-a.
yaroo_s
Ok,
Dzięki, sporo mi pomogłeś. Mialbym jeszcze jedno pytanie, czy jest możliwośc by w czasie blokady tablicy była możliwość odczytania ale tylko przez pewne zapytanie. Generalnie chodzi o to by była mozliwość odczytaniewa dla wszystkich z wyjatkiem 3-4 zapytań.... czy jest możliwość usttawienia tak by cześć zapytań mogła odczytywac dane a cześć nie?
maragoska
Nie testowałem tego z bazą MySQL, ale mogę podać wskazówkę. Proponuję zapoznać się z poziomami izolacji transakcji. Można je ustawić w ramach sesji jak i globalnie.
SongoQ
Cytat
czy jest możliwość usttawienia tak by cześć zapytań mogła odczytywac dane a cześć nie?

Blokowanie jest tylko to zapytania ktore modyfikuja stan bazy. Dla modyfikacji "teoretycznie" blokowany jest rekord dla ktorego jest wykonywana modyfikacji i nic innego.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.