Kiedy złe rzeczy dzieją się dobrym danym, czyli podstawy transakcji w MySQL 4.1



Podobne dokumenty
Wykład 8. SQL praca z tabelami 5

Bazy danych 7. SQL podstawy

Wyzwalacze (triggery) Przykład

Laboratorium nr 4. Temat: SQL część II. Polecenia DML

Język SQL, zajęcia nr 1

Bazy danych i usługi sieciowe

E.14 Bazy Danych cz. 18 SQL Funkcje, procedury składowane i wyzwalacze

Bazy danych 9. SQL Klucze obce Transakcje

Bazy danych 10. SQL Widoki

Wykład 05 Bazy danych

Bazy danych 6. Klucze obce. P. F. Góra

Ćwiczenia laboratoryjne nr 11 Bazy danych i SQL.

Literatura: SQL Ćwiczenia praktyczne Autor: Marcin Lis Wydawnictwo: Helion. Autor: Joanna Karwowska

Bazy danych. Wykład IV SQL - wprowadzenie. Copyrights by Arkadiusz Rzucidło 1

Bazy Danych i Usługi Sieciowe

SQL Server. Odtwarzanie baz danych.

Blaski i cienie wyzwalaczy w relacyjnych bazach danych. Mgr inż. Andrzej Ptasznik

strukturalny język zapytań używany do tworzenia i modyfikowania baz danych oraz do umieszczania i pobierania danych z baz danych

Projektowanie systemów baz danych

Wykład 5. SQL praca z tabelami 2

Transakcje jednocześnie ACID

Struktura drzewa w MySQL. Michał Tyszczenko

Programowanie w SQL procedury i funkcje. UWAGA: Proszę nie zapominać o prefiksowaniu nazw obiektów ciągiem [OLIMP\{nr indeksu}] Funkcje użytkownika

Języki programowania wysokiego poziomu. PHP cz.4. Bazy danych

Bazy danych 5. Samozłaczenie SQL podstawy

Bazy danych. Bazy danych. Podstawy języka SQL. Dr inż. Paweł Kasprowski.

Wprowadzenie do BD Operacje na bazie i tabelach Co poza zapytaniami? Algebra relacji. Bazy Danych i Systemy informacyjne Wykład 2.

Kurs. Podstawy MySQL

Bazy Danych. Ćwiczenie 13: transakcje w bazach danych

Wprowadzenie do projektowania i wykorzystania baz danych Relacje

Bazy danych 9. Klucze obce Transakcje

3 Przygotowali: mgr inż. Barbara Łukawska, mgr inż. Maciej Lasota

Typy tabel serwera MySQL

Bazy danych 9. Klucze obce Transakcje. P. F. Góra

Bazy danych dla producenta mebli tapicerowanych. Bartosz Janiak Marcin Sikora Wrocław r.

1. Tworzenie tabeli. 2. Umieszczanie danych w tabeli

Język SQL, zajęcia nr 2

Rozdział 17. Zarządzanie współbieżnością zadania dodatkowe

Przykład 3 Zdefiniuj w bazie danych hurtownia_nazwisko przykładową funkcję użytkownika fn_rok;

Kowalski Marcin Wrocław, dn Jaśkiewicz Kamil Bazy Danych 1 Podstawy Projekt Temat: Baza danych do zarządzania projektami

Aby uruchomić program klienta i połączyć się z serwerem, należy komendę:

Instalacja MySQL.

Przykłady najlepiej wykonywać od razu na bazie i eksperymentować z nimi.

Internetowe bazy danych

Składowane procedury i funkcje

Obsługa błędów w SQL i transakcje. Obsługa błędów w SQL

P o d s t a w y j ę z y k a S Q L

Trigger jest obiektem związanym z tablicą, który aktywuje się gdy do tablicy następuje odpowiednie zapytanie.

Programowanie w Ruby

Bazy danych - Materiały do laboratoriów VIII

PRZESTRZENNE BAZY DANYCH WYKŁAD 2

Bazy danych 4. SQL podstawy. P. F. Góra

Autor: Joanna Karwowska

Wydział Elektrotechniki, Informatyki i Telekomunikacji Instytut Informatyki i Elektroniki Instrukcja do zajęć laboratoryjnych

BAZY DANYCH Cz III. Transakcje, Triggery

Programowanie MSQL. show databases; - pokazanie jakie bazy danych są dostępne na koncie

Baza danych do przechowywania użytkowników

Wprowadzenie do projektowania i wykorzystania baz danych. Katarzyna Klessa

Tworzenie tabeli przez select CREATE TABLE PRAC2 AS SELECT P.NAZWISKO, Z.NAZWA FROM PRAC P NATURAL JOIN ZESP Z

DECLARE VARIABLE zmienna1 typ danych; BEGIN

Bazy danych. Dr inż. Paweł Kasprowski

PHP: bazy danych, SQL, AJAX i JSON

mysql> UPDATE user SET Password=PASSWORD('pass') WHERE user='root'; Query OK, 2 rows affected (0.05 sec) Rows matched: 2 Changed: 2 Warnings: 0

Bazy danych. Dr inż. Paweł Kasprowski

Sprawdzenie poziomu izolacji transakcji (w aktualnym połączeniu):

Bazy danych. Polecenia SQL

Imię i Nazwisko Data Ocena. Laboratorium 7

Wykład 5: PHP: praca z bazą danych MySQL

Zarządzanie obiektami bazy danych Oracle11g

Podstawy technologii WWW

Aplikacje bazodanowe. Laboratorium 1. Dawid Poªap Aplikacje bazodanowe - laboratorium 1 Luty, 22, / 37

Język DML. Instrukcje DML w różnych implementacjach SQL są bardzo podobne. Podstawowymi instrukcjami DML są: SELECT INSERT UPDATE DELETE

Instytut Mechaniki i Inżynierii Obliczeniowej Wydział Mechaniczny Technologiczny Politechnika Śląska

W tej części zajmiemy się ćwiczeniami dotyczącymi modyfikacji rekordów.

Relacyjne bazy danych. Podstawy SQL

LAB 6 BEGIN TRANSACTION, COMMIT, ROLLBACK, SET TRANSACTION ISOLATION LEVEL,

Instrukcja podwaja zarobki osób, których imiona zaczynają się P i dalsze litery alfabetu zakładamy, że takich osbób jest kilkanaście.

Bazy Danych - Instrukcja do Ćwiczenia laboratoryjnego nr 8

Transakcje W poprzednich częściach instrukcje języka SQL traktowane były jak indywidualne operacje (transakcje)

Bazy danych 4. SQL- podstawy

koledzy, Jan, Nowak, ul. Niecała 8/23, , Wrocław, , ,

Bazy danych 12. SQL Wyszukiwanie pełnotekstowe

1 Zaznacz poprawne stwierdzenia dotyczące grup plików (filegroup) możemy określić do której grupy plików trafi

SQL 4 Structured Query Lenguage

Bazy danych i usługi sieciowe

I. Język manipulowania danymi - DML (Data Manipulation Language). Polecenia INSERT, UPDATE, DELETE

Projektowanie aplikacji w modelu MVC opartej o framework CodeIgniter

Projektowanie bazy danych. Jarosław Kuchta Projektowanie Aplikacji Internetowych

Struktura bazy danych

znajdowały się różne instrukcje) to tak naprawdę definicja funkcji main.

Wyzwalacz - procedura wyzwalana, składowana fizycznie w bazie, uruchamiana automatycznie po nastąpieniu określonego w definicji zdarzenia

Połączenie z bazą danych : mysql h u root -p Enter password: *******

Zarządzanie bazą danych. Bazy Danych i Systemy informacyjne Wykład 4. Piotr Syga

Bazy danych 7. Klucze obce Transakcje. P. F. Góra

ORACLE (Wykład 1) aragorn.pb.bialystok.pl/~aonisko. Typy rozproszonych baz danych. Systemy klient-serwer. Klient-serwer: Przykład

SQL (ang. Structured Query Language)

BAZA DANYCH SIECI HOTELI

BAZY DANYCH. Transakcje. opracowanie: Michał Lech

Transkrypt:

Kiedy złe rzeczy dzieją się dobrym danym, czyli podstawy transakcji w MySQL 4.1 emil@bronikowski.com Świat współczesny w którym oprogramowanie komputerowe zarządza większością aspektów naszego życia nauczył nas jednego. Oprogramowanie się psuje. Kiedy oprogramowanie się psuje, ludzie płaczą. Różni ludzie: klienci, których książeczka oszczędnościowa wykazuje stratę szesnastu milionów złotych, programiści, którzy muszą coś z tym zrobić oraz obsługujący te programy, bo klienci starają się ich udusić przez te małe otwory w okienkach a programiści nic nie robią, żeby to naprawić. Podsumowując: zepsuty program to straszny problem. Problem tym większy im ważniejsze dane ucierpiały. Gro danych spędza swoje życie w bazach danych. Różne bazy danych zapewniają różną funkcjonalność, ale mimo to do pewnego stopnia działają podobnie, w ten sam sposób w jaki Maluch i Ford działają podobnie -- jeden z nich ma silnik o parametrach kosiarki do trawy, ale oba są samochodami. W tym krótkim artykule chciałbym zająć się konceptem transakcji w serwerach baz danych MySQL. MySQL przez długi czas odstawał w funkcjonalności. Mimo to stał się bazą bardzo popularną i po pewnym czasie, dzięki masie krytycznej użytkowników, rozpoczął drogę ku nowym możliwością. Z pojawieniem się wersji 4.x serwer ten dorobił się silnika składowania danych wspierających transakcje. Co to jest ta transakcja i jaki ma związek ze wstępem? Ogólnie mówiąc transakcja to sposób w który zabezpieczamy nasze dane przez problemami. Bardzo wygodny sposób na odkręcenie tego, cośmy zepsuli. Transakcja to nic innego jak powiedzenie bazie -- Słuchaj, jest taka sprawa. Od tej pory zwracaj uwagę na wszystko co Ci będę mówił, rób to, ale tak, żeby się dało natychmiast odkręcić. Jak Ci powiem, że jest dobrze, zrób to i zapomnij. Wyobraźmy sobie, że projektujemy system w którym będziemy składować długi. Stwórzmy dwie tablice jako przykład takiego systemu: (Oczywiście, nie jest to optymalny schemat, ale nie będziemy teraz kombinować) CREATE TABLE `test`.`people` ( `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, `name` VARCHAR(64) NOT NULL, PRIMARY KEY(`id`) ) ENGINE = InnoDB COMMENT = 'Lista ludzi';

CREATE TABLE `test`.`cash` ( `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, `fpersonid` INT(11) UNSIGNED NOT NULL, `spersonid` INT(11) UNSIGNED NOT NULL, `cash` FLOAT UNSIGNED NOT NULL, `operationtype` ENUM('LOAN','PAYBACK') NOT NULL DEFAULT 'LOAN', `performedat` DATETIME NOT NULL, PRIMARY KEY(`id`) ) ENGINE = InnoDB COMMENT = 'tu lezy kasa'; Proszę zwrócić uwagę na pogrubiony parametr ENGINE. InnoDB jest właśnie tym silnikiem, który potrafi dokonywać transakcji. Stwórzmy więc trochę danych na których można pokazać jak to wszystko działa. Na początek dodajmy kilka osób: mysql> INSERT INTO people(name) VALUES ('opi'),('shot'),('malina'); Query OK, 3 rows affected (0.08 sec) OK, teraz użytkownik opi (ID 1) będzie winien użytkownikowi Shot (ID 2) trochę pieniędzy. mysql> INSERT INTO cash(fpersonid, spersonid, cash, performedat) VALUES (2,1,600.00,NOW()) ; Query OK, 1 row affected (0.08 sec) Świetnie. Mamy teraz jakieś dane. To mogą być bardzo ważne dane dla użytkowników, szczególnie dla użytkownika o ID 2. Załóżmy teraz, że użytkownik ID 2 oddał część pieniędzy. mysql> INSERT INTO cash(fpersonid, spersonid, cash, performedat,operationtype) VALUES (1,2,2000.00,NOW(),'PAYBACK') ; Query OK, 1 row affected (0.24 sec) No ładnie. System się pomylił i oddał trochę za dużo. Operator próbuje więc dodać poprawny wpis... mysql> INSERT INTO cash(fpersonid, spersonid, cash, performedat,operationtype) VALUES (1,2,200.00,NOW(),'PAYBACK') ; Query OK, 1 row affected (0.24 sec)...no i skasować błędny. Niestety, znów się myli i zamiast jednego wpisu, kasuje wszystkie. mysql> DELETE FROM cash; Query OK, 3 rows affected (0.22 sec)

Od tej pory w firmie zaczyna się awantura. Kto to teraz ma naprawić? Kto będzie bez premii? Czy użytkownik ID 2 ma szansę odzyskać swoje pieniądze? Czy ID1 ujdzie to na sucho? Dlaczego nie robimy kopi bezpieczeństwa częściej. Każdy kto miał w swojej karierze okazję zepsucia czegoś większego zna pewnie takie sytuacje. Wyobraźmy sobie, że sytuacja jest już rozwiązana, kopia bezpieczeństwa się znalazła i starczył jeden nieodpłatny weekend pracy, żeby wszystko odkręcić. Niezbyt zadowoleni ludzie pytają więc programistów czy nie mogliby dać im szansy wycofać się z błędnych decyzji. Pada decyzja, żeby wszystkie ważne decyzje finansowe przeprowadzać podczas transakcji. Aby rozpocząć transakcje należy poinformować o tym bazę danych. Robi się to jednym poleceniem: mysql> START TRANSACTION; Query OK, 0 rows affected (0.00 sec) Od tej pory system zapamięta wszystkie zmiany które wprowadzimy i da nam szansę na wycofanie się z nich rakiem (ROLLBACK) i potwierdzenie (COMMIT). Zobaczmy jak to działa w naszym przykładzie. Wiemy, że użytkownik ID3 nazywa się inaczej a obecna wartość pola name to zawołanie bojowe 1 -- chcemy zmienić więc dane tak, żeby odzwierciedlały one rzeczywistość. mysql> UPDATE people SET name = 'Marta' WHERE id = 2; Query OK, 1 row affected (0.41 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> SELECT name FROM people; name opi Marta Malina No i ładnie. Nie dość, że wcześniej pozbawiłem użytkownika ID 2 pieniędzy to teraz jeszcze ma uszczerbek na męskości. Na szczęście baza opiekowała się danymi bo byliśmy w trakcie transakcji, możemy więc spróbować naprawić nasz błąd. mysql> ROLLBACK; Query OK, 0 rows affected (0.04 sec) mysql> SELECT name FROM people; name opi Shot Malina Jak widzimy wszystkie zmiany zostały cofnięte. Jesteśmy uratowani. Tym razem zamiast manualnego odtwarzania danych nasz problem rozwiązał mechanizm transakcji. 1 Facet od PO mówił tak na pseudonimy

Ponieważ polityka historyczna jest teraz na topie, przytoczmy jeszcze jeden przykład. mysql> INSERT INTO people(name) VALUE ('Lech W.'); mysql> START TRANSACTION; (1,4,100000000.00,NOW()); (2,4,100000000.00,NOW()); (3,4,100000000.00,NOW()); Użytkownik ID4 jest winny innym użytkownikom po sto milionów (przed denominacją). Ponieważ wszystko jest OK, mówimy bazie, żeby dane w tej transakcji przyjęła za właściwe. mysql> COMMIT; Słowo o hermetyzacji w transakcji. Kiedy rozpoczynamy transakcję i zmieniamy dane podczas jej trwania, wszystkie zmiany są niewidoczne dla innych połączeń z bazą. Póki nie wywołaliście COMMIT dla poprzedniego przykładu inni użytkownicy systemu widzieli użytkownika ID4, Lecha W. ale już wszystkie operacje finansowe nie były częścią ich wiedzy. Jeśli projektujecie aplikację która jest używana przez kilka osób jednocześnie to warto o tym pamiętać. Jak więc widzicie transakcje są bardzo przydatnym mechanizmem w bazach danych. Chronią Was i zapewniają metodę wycofania się z różnego rodzaju błędów. W prawdziwym świecie nie używa się oczywiście ich tak, jak tu pokazałem. Wystarczy jednak pomyśleć o systemie, który rejestruje użytkowników. Podczas rejestracji, prócz danych użytkownika, tworzona jest także grupa i dołączana fotka. Co by się stało gdybyśmy nie dodawali takiego użytkownika podczas transakcji? Użytkownik traci połączenie z bazą np. w wyniku awarii sieci, zostawiając po sobie konto, ale takie, które nie ma dopisanych danych o grupie ani zdjęcia, gdyż pierwsze zapytanie się wykonało a inne już nie. W transakcji utrata połączenia może się równać z wywołaniem ROLLBACK i odkręceniem wszystkiego oraz umożliwieniem ponownej próby dla nieszczęśliwego użytkownika. Na koniec kilka luźnych uwag w temacie projektowania systemów i używania transakcji. InnoDB jest wolniejsze od standardowego silnika baz danych dostępnego w MySQL Nie wszystkie firmy utrzymujące strony dają możliwość tworzenia tablic typu InnoDB. Podyktowane jest to trochę mniejszymi możliwościami administracyjnymi (brak tak łatwej kontroli rozmiaru bazy) i większymi wymaganiami jeżeli chodzi o zasoby

Nie wszystko wymaga transakcji. To, że możesz coś zrobić, nie znaczy, że musisz. Jeżeli stracisz jedną linijkę logów w wyniku awarii to świat się nie zawali. Strata jednej wpłaty w systemie finansowym może być znacząca. Pamiętaj o hermetyzacji. ALTER/CREATE/DROP nie podlegają dyrektywie ROLLBACK. ALTER/CREATE/LOCK/UNLOCK powodują automatyczne wywołanie COMMIT