![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 2 Pomógł: 0 Dołączył: 1.12.2003 Ostrzeżenie: (0%) ![]() ![]() |
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. |
|
|
![]() |
![]()
Post
#2
|
|
![]() Grupa: Zarejestrowani Postów: 215 Pomógł: 1 Dołączył: 13.04.2003 Skąd: z ławki przed blokiem Ostrzeżenie: (0%) ![]() ![]() |
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 ![]() |
|
|
![]()
Post
#3
|
|
![]() Grupa: Przyjaciele php.pl Postów: 660 Pomógł: 0 Dołączył: 28.08.2002 Skąd: Starachowice Ostrzeżenie: (0%) ![]() ![]() |
php => Bazy danych
|
|
|
![]()
Post
#4
|
|
![]() Grupa: Zarząd Postów: 2 277 Pomógł: 6 Dołączył: 27.12.2002 Skąd: Wołów/Wrocław ![]() |
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. -------------------- "Niezależnie od tego, jakie masz osiągnięcia, ktoś Ci pomaga..."
|
|
|
![]()
Post
#5
|
|
![]() Grupa: Zarejestrowani Postów: 384 Pomógł: 0 Dołączył: 3.04.2003 Skąd: Chorzow Ostrzeżenie: (0%) ![]() ![]() |
no jest to pewna armata
![]() polecam poczytanie tez o innodb w MySQL-u, transakcjach i skladni select .... for update |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 6 Pomógł: 0 Dołączył: 18.11.2004 Ostrzeżenie: (0%) ![]() ![]() |
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
5. Na każdej sesji wykonuję 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. -------------------- Giełda turystyczna - rezerwacje on-line
|
|
|
![]()
Post
#7
|
|
![]() Grupa: Zarejestrowani Postów: 32 Pomógł: 0 Dołączył: 10.02.2005 Skąd: Goleniów (pod Szczecinem) Ostrzeżenie: (0%) ![]() ![]() |
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..) |
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 6 Pomógł: 0 Dołączył: 18.11.2004 Ostrzeżenie: (0%) ![]() ![]() |
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. -------------------- Giełda turystyczna - rezerwacje on-line
|
|
|
![]()
Post
#9
|
|
![]() Grupa: Zarejestrowani Postów: 32 Pomógł: 0 Dołączył: 10.02.2005 Skąd: Goleniów (pod Szczecinem) Ostrzeżenie: (0%) ![]() ![]() |
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? Ten post edytował yaroo_s 8.09.2005, 10:41:05 |
|
|
![]()
Post
#10
|
|
Grupa: Zarejestrowani Postów: 6 Pomógł: 0 Dołączył: 18.11.2004 Ostrzeżenie: (0%) ![]() ![]() |
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.
-------------------- Giełda turystyczna - rezerwacje on-line
|
|
|
![]()
Post
#11
|
|
![]() Grupa: Przyjaciele php.pl Postów: 2 923 Pomógł: 9 Dołączył: 25.10.2004 Skąd: Rzeszów - studia / Warszawa - praca Ostrzeżenie: (0%) ![]() ![]() |
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. -------------------- |
|
|
![]() ![]() |
![]() |
Aktualny czas: 22.08.2025 - 02:21 |