Pesymistyczne blokowanie wierszy do odczytu w bazie danych MySQL

Ostatnio natknąłem się na problem kiedy rekord w bazie danych był edytowany w tym samym czasie przez kilka procesów. Pisząc procesy mam na myśli skrypty, które uruchamiane mogą być w dowolnej chwili i trwać (wykonywać się) przez różny okres czasu choć  w tym przypadku raczej bardzo krótki.

W przypadku kiedy dwa procesy modyfikują rekord w tym samym czasie to zazwyczaj zmiany wprowadzone przez pierwszy proces są nadpisywane przez ten drugi, co oczywiście jest niepożądane. Dzieje się tak dlatego ponieważ drugi proces odczytuje zawartość rekordu zanim pierwszy proces zapisze swoje zmiany. Jest to tak zwana opcja „ostatni wygrywa”.

Rozwiązaniem problemu jest zablokowanie wiersza do odczytu poprzez zapytanie

SELECT * FROM `testlock` FOR UPDATE

zapytanie to blokuje dany wiersz i wszystkie powiązane z nim poprzez indeksy wiersze. Jest to rodzaj blokowania pesymistycznego w którym rekord blokowany jest od momentu odczytania danych do momentu zapisania zmodyfikowanych danych do bazy.

Blokada ta obsługiwana jest w MySQL tylko przez silnik InnoDB. Zapytanie musi być wykonane w transakcji a blokada z wiersza jest zdejmowana kiedy transakcja jest zatwierdzona (commited) lub wycofana (rolled back).

Uwaga

Nie jest to dobre podejście do sprawy jeśli chcemy rozwiązać problem edycji tego samego artykułu przez dwóch redaktorów. Tam powinno to wyglądać nieco inaczej. Przede wszystkim redaktor, który zaczyna edycję jako drugi powinien zostać poinformowany, że artykuł jest już przez kogoś edytowany i że powinien poczekać, ewentualnie można wprowadzić edycję live np. taką jak mamy w Google Docs.

Przydatne linki

PhpStorm 8 z obsługą @Blade templates

Pojawiła się właśnie wersja EAP 138.1505 świetnego IDE jakim jest PHPStorm. W tej wersji dodano m.in. pełne wsparcie dla szablonów blade, które są domyślnym systemem szablonów dla frameworka Laravel. Wspierane funkcje to:
Czytaj dalej PhpStorm 8 z obsługą @Blade templates

Następną wersją PHP będzie PHP 7

Głosowanie nad wersją PHP 6 vs PHP 7 zostało zakończone i stosunkiem głosów 58 do 24 wygrała wersja PHP 7.

A jakie jest wasze zdanie? Ja skłaniałem się na początku do wersji PHP 6, jednak argumenty przytoczone za wersją PHP 7 przekonały mnie i myślę, że podjęta została dobra decyzja.

The vote has ended. By 58 votes to 24, the next major release of PHP, to succeed the 5.x series, shall be named PHP 7.

Hopefully this is the end of the matter and we can get onto matters of implementation and features, rather than naming. 🙂

http://news.php.net/php.internals/76254

Co nowego w PHP 5.6: Argument unpacking

W trzeciej części co nowego w PHP 5.6 przedstawię zagadnienie nazwane argument unpacking. Nie spotkałem się z polskim tłumaczeniem, ale myślę że można to nazwać rozwinięciem lub wypakowaniem argumentów. Jeśli się nie zgadzacie lub macie lepsze tłumaczenie zapraszam do komentowania.
Czytaj dalej Co nowego w PHP 5.6: Argument unpacking

Sesje i Redirect w Laravel a UTF-8 BOM

Jeśli mieliście kiedyś problem, że sesja w waszej aplikacji nie była utrzymywana pomiędzy zapytaniami do serwera lub podczas wykonywania przekierowania pojawiał się napis:


Redirect to: http://localhost/przekieruj/na

to przyczyną może być to, że pliki w aplikacji mają kodowanie UTF-8 z BOM.

BOM można bardzo łatwo usunąć przy pomocy PhpStorm’a. Kiedy mamy otwarty plik wystarczy kliknąć prawym klawiszem myszy i wybrać polecenie: Remove BOM.

Aby znaleźć pliki z kodowaniem BOM wykonaj komendę:


grep -rl $'xEFxBBxBF' .

więcej na: http://stackoverflow.com/a/2858757/1343422

Więcej o problemach z sesjami i wysyłaniem nagłówków w PHP przeczytasz na:
UTF-8 i problemy w PHP oraz Flash – BOM (Byte Order Mark)