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

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

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

Wykład 8. SQL praca z tabelami 5

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

Bazy danych - Materiały do laboratoriów VIII

Wykład 05 Bazy danych

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

15. Funkcje i procedury składowane PL/SQL

Plan bazy: Kod zakładający bazę danych: DROP TABLE noclegi CASCADE; CREATE TABLE noclegi( id_noclegu SERIAL NOT NULL,

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

Ustawienie na poziomie sesji (działa do zmiany lub zakończenia sesji zamknięcia połączenia).

Aspekty aktywne baz danych

UPDATE Studenci SET Rok = Rok + 1 WHERE Rodzaj_studiow =' INŻ_ST'; UPDATE Studenci SET Rok = Rok 1 WHERE Nr_albumu IN ( '111345','100678');

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

Oracle PL/SQL. Paweł Rajba.

DECLARE <nazwa_zmiennej> typ [(<rozmiar> )] [ NOT NULL ] [ { := DEFAULT } <wartość> ];

przykłady problemów; realizacja dostaw części od producenta do klienta:

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

BAZA DANYCH SIECI HOTELI

Tworzenie tabel. Bazy danych - laboratorium, Hanna Kleban 1

Procedury wyzwalane. (c) Instytut Informatyki Politechniki Poznańskiej 1

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

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

Wyzwalacze (triggery) Przykład

Wyzwalacze. do automatycznego generowania wartości kluczy głównych. Składnia instrukcji tworzacej wyzwalacz

DECLARE VARIABLE zmienna1 typ danych; BEGIN

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

Bazy danych 10. SQL Widoki

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

Hurtownia Świętego Mikołaja projekt bazy danych

Przykładowa baza danych BIBLIOTEKA

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

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

PL/SQL. Zaawansowane tematy PL/SQL. Piotr Medoń

Ćwiczenia laboratoryjne nr 11 Bazy danych i SQL.

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

Właściwości transakcji

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

Zarządzanie obiektami bazy danych Oracle11g

Procedury składowane. Funkcje vs. procedury Funkcja. Procedura. zazwyczaj ma parametry tylko typu IN; można wywoływać z poziomu

Paweł Rajba

Widok Connections po utworzeniu połączenia. Obszar roboczy

Administracja i programowanie pod Microsoft SQL Server 2000

1 Przetwarzanie transakcyjne Cechy transakcji Rozpoczęcie i zakończenie Punkty bezpieczeństwa... 3

Język SQL, zajęcia nr 1

Język SQL. Rozdział 8. Język manipulowania danymi DML

BAZY DANYCH. Transakcje. opracowanie: Michał Lech

Zaawansowane bazy danych i hurtownie danych semestr I

Wykład V. Indeksy. Struktura indeksu składa się z rekordów o dwóch polach

Ile rekordów będzie zawierała tabela przy założeniu, że na początku była pusta?

Bazy danych i usługi sieciowe

Struktura bazy danych

Uprawnienia, role, synonimy

Imię i Nazwisko Data Ocena. Laboratorium 7

Język SQL. Rozdział 9. Język definiowania danych DDL, część 2.

Autor: Joanna Karwowska

Bazy Danych i Usługi Sieciowe

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

Bloki anonimowe w PL/SQL

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

Pakiety podprogramów Dynamiczny SQL

Plan ćwiczenia. Rozdział 16 Uwierzytelnianie i autoryzacja w bazie danych. Użytkownicy i schematy (1) Użytkownicy i schematy (2) baza danych: ZESP99

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

SQL DDL DML TECHNOLOGIE BAZ DANYCH. Wykład 5: Język DDL i DML. Małgorzata Krętowska

Relacyjne bazy danych. Podstawy SQL

Bazy danych i usługi sieciowe

41. Zmienne lokalne muszą mieć nazwę, którą poprzedza (maksymalnie 128 znaków) oraz typ (każdy z wyjątkiem: text, ntext oraz image)

Rozszerzenia grupowania

Internetowe bazy danych

Bazy danych wykład dwunasty PL/SQL, c.d. Konrad Zdanowski ( Uniwersytet Kardynała Stefana Bazy danych Wyszyńskiego, wykładwarszawa)

Wykład 5 funkcje i procedury pamiętane widoki (perspektywy) wyzwalacze

SQL :: Data Definition Language

Zbiór pytań nr 5. 2 Które stwierdzenie opisuje najlepiej zbiór uprawnień dostępny po wykonaniu

BAZY DANYCH Cz III. Transakcje, Triggery

Projektowanie systemów baz danych

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

1. Wyzwalacze BD (ang. triggers)

Wykład 5. SQL praca z tabelami 2

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

Wzorce dystrybucji i wspólbieżności autonomicznej

1. Połączenie z bazą danych. W wybranym edytorze tworzymy plik sqltest.py i umieszczamy w nim poniższy kod. #!/usr/bin/python3 import sqlite3

Plan ćwiczenia. Rozdział 17. zarządzania współbieżnością. Dostęp współbieżny a dostęp spójny. Spójność bazy danych

Bazy Danych - Instrukcja do Ćwiczenia laboratoryjnego nr 8

Odnawialne Źródła Energii I rok. Tutorial PostgreSQL

Język SQL. Rozdział 10. Perspektywy Stosowanie perspektyw, tworzenie perspektyw prostych i złożonych, perspektywy modyfikowalne i niemodyfikowalne.

Plan ćwiczenia. Rozdział 17 Zarządzanie współbieżnością. Dostęp współbieżny a dostęp spójny. Spójność bazy danych

Materiały. Technologie baz danych. Plan wykładu Kursory. Wykład 5: Kursory jawne. Podprogramy. Kursory jawne. Kursory niejawne

Relacyjne bazy danych. Podstawy SQL

kończy wysyłanie danych do pliku tworzy strukturę tabeli wyświetla opis struktury tabeli zmiana nazwy tabeli usuwanie tabeli

Systemy baz danych 2 laboratorium Projekt zaliczeniowy

SQL w języku PL/SQL. 2) Instrukcje języka definicji danych DDL DROP, CREATE, ALTER, GRANT, REVOKE

Oracle PL/SQL. Paweł Rajba.

Bazy danych wykład szósty Więzy i wyzwalacze. Konrad Zdanowski ( Uniwersytet Kardynała Stefana Bazy danych Wyszyńskiego, wykładwarszawa)

PRZESTRZENNE BAZY DANYCH WYKŁAD 2

Ref. 7 - Język SQL - polecenia DDL i DML

SQL> startup pfile=./admin/pfile/initdbx.ora. SQL> create spfile from pfile='$home/admin/pfile/initdbx.ora' create user bolek identified by bolek;

Post-relacyjne bazy danych

Transkrypt:

Rozdział 17. Zarządzanie współbieżnością zadania dodatkowe -- Definicje relacji i utworzenie stanu początkowego dla ćwiczeń z synchronizacji transakcji DROP TABLE Konta cascade constraints; DROP TABLE Przelewy_zlecone cascade constraints; DROP TABLE Przelewy_wykonane cascade constraints; DROP TABLE Przelewy_realizowane cascade constraints; DROP SEQUENCE seqpz; DROP SEQUENCE seqpw; DROP SEQUENCE seqpdz; CREATE TABLE Konta( numer NUMBER(26) PRIMARY KEY, id_klienta NUMBER(9), saldo NUMBER(12,2)); CREATE TABLE Przelewy_zlecone( id NUMBER(9) PRIMARY KEY, nr_konta NUMBER(26) REFERENCES Konta(numer), data_zlecenia DATE, data_realizacji DATE, konto_docelowe NUMBER(26) REFERENCES Konta(numer), kwota NUMBER(12,2)); CREATE TABLE Przelewy_wykonane( id NUMBER(9) PRIMARY KEY, nr_konta NUMBER(26) REFERENCES Konta(numer), data_realizacji DATE, konto_docelowe NUMBER(26) REFERENCES Konta(numer), data_księgowania DATE, kwota NUMBER(12,2)); CREATE TABLE Przelewy_realizowane( id NUMBER(9) PRIMARY KEY, nr_konta NUMBER(26) REFERENCES Konta(numer), konto_źródłowe NUMBER(26) REFERENCES Konta(numer), kwota NUMBER(12,2), data DATE); INSERT INTO Konta VALUES (11111,1,10000); INSERT INTO Konta VALUES (55555,2,200000); CREATE SEQUENCE seqpz START WITH 1 INCREMENT BY 1; CREATE SEQUENCE seqpw START WITH 1 INCREMENT BY 1; CREATE SEQUENCE seqpdz START WITH 1 INCREMENT BY 1; INSERT INTO Przelewy_zlecone VALUES (seqpz.nextval, 11111, DATE '2014-10-31', DATE '2014-11-4', 55555, 5000); COMMIT;

-- Polecenia dla odtworzenia stanu bazy danych po nieudanych próbach symchronizacji -- UPDATE Konta SET saldo = 10000 WHERE -- DELETE FROM Przelewy_zlecone; -- INSERT INTO Przelewy_zlecone VALUES (seqpz.nextval, 11111, DATE '2014-10-31', DATE '2014-11-4', 55555, 5000); -- COMMIT

Dany jest schemat relacyjnej bazy danych. Przelewy_zlecone(id, nr_konta, data_zlecenia, data_realizacji, konto_docelowe,kwota) Przelewy_wykonane(id, nr_konta, data_realizacji, konto_docelowe, data_księgowania, kwota) Przelewy_realizowane (id, nr_konta, konto_źródłowe, kwota, data) Konto(numer, id_klienta, saldo) W każdym z poniższych zadań, zweryfikuj poprawność podanych współbieżnych historii. Ustal, czy występują w nich jakieś znane Ci anomalie? Następnie zmodyfikuj transakcje tak, żeby wynik ich przetwarzania był poprawny. Modyfikacje transakcji mogą obejmować: 1. zmiany granic transakcji, 2. zmianę domyślnego trybu izolacji, 3. jawne blokowanie tabel, 4. jawne blokowanie wierszy. Zidentyfikuj uniwersalny problem, który kryje się za przypadkiem z każdego z zadań i zaproponuj metodykę dla rozwiązania zdefiniowanego problemu.

Zadanie nr 1 Sesja 1: Realizuje zleconą operację przelewu variable id number variable nr_konta number variable konto_doc number variable data varchar2(10) variable kwota number exec :data := '14/11/04' exec select id, nr_konta, data_realizacji, konto_docelowe, kwota into :id, :nr_konta, :data, :konto_doc, :kwota from Przelewy_zlecone where nr_konta = :nr_konta and data_realizacji = :data; -- przyjmujemy, że istnieje dokładnie jedna taka krotka exec insert into Przelewy_realizowane values (seqpdz.nextval, :konto_doc, :nr_konta, :kwota, :data); exec insert into Przelewy_wykonane values (seqpw.nextval,:nr_konta, :data,:konto_doc,null,:kwota); exec update Konta set saldo = saldo - :kwota where numer = :nr_konta; exec delete from Przelewy_zlecone where id = :id; Sesja 2: Wyznacza dostępne środki na koncie jako różnicę salda i sumy wszystkich oczekujących operacji przelewów. variable saldo_skorygowane number variable nr_konta number nr_konta = :nr_konta) into :saldo_skorygowane from Konta where numer = :nr_konta; print :saldo_skorygowane; -- poprawna wartość 5000 zł Zweryfikuj poprawność współbieżnej historii powyższych dwóch sesji dla uporządkowania operacji: 1.1 < 2.1 < 1.2. Po każdej nieudanej próbie, przywróć początkowy stan bazy danych!!!!!!!!!!

Zadanie nr 2 Przywróć początkowy stan bazy danych i sprawdź, czy dostępne są wszystkie zmienne wiązania zdefiniowane w zadaniu nr 1. Sesja 1: Realizuje zleconą operację przelewu exec select id, nr_konta, data_realizacji, konto_docelowe, kwota into :id, :nr_konta, :data, :konto_doc, :kwota from Przelewy_zlecone where nr_konta = :nr_konta and data_realizacji = :data; -- przyjmujemy, że istnieje dokładnie jedna taka krotka exec insert into Przelewy_realizowane values (seqpdz.nextval, :konto_doc, :nr_konta, :kwota, :data); exec insert into Przelewy_wykonane values (seqpw.nextval,:nr_konta, :data,:konto_doc,null,:kwota); exec update Konta set saldo = saldo - :kwota where numer = :nr_konta; exec delete from Przelewy_zlecone where id = :id; Sesja 2: Wyznacza dostępne środki na koncie -- aplikacja zaimplementowana w środowisku O/RM dwie operacje odczytu variable obciążenia number exec select sum(kwota) into :obciążenia from Przelewy_zlecone where nr_konta = :nr_konta; print obciążenia exec select (saldo :obciążenia) into :saldo_skorygowane from Konta where numer = :nr_konta; -- poprawna wartość 5000 zł uporządkowania operacji: 2.1 < 1.1 < 2.2. Jak należy zmodyfikować powyższe sesje, żeby niezależnie od kolejności operacji w historii współbieżnej tych dwóch sesji, transakcja w sesji nr 2 zawsze zwracała poprawną wartość dostępnych środków na koncie.

Zadanie nr 3 Sesja 1 realizuje operację wpłaty na wybrane konto: -- aplikacja zaimplementowana w środowisku O/RM w związku z czym -- przetwarzanie danych odbywa się po stronie serwera aplikacji, -- a nie serwera bazy danych variable saldo number exec select saldo into :saldo from Konta where exec :saldo := :saldo + 2500; exec update konta set saldo = :saldo where --... inne operacje Sesja 2 realizuje natychmiastowy przelew pieniędzy na wybrane konto: variable saldo number exec select saldo into :saldo from Konta where exec :saldo := :saldo - 500; exec update konta set saldo = :saldo where --... inne operacje exec select saldo into :saldo from konta where -- poprawna wartość 12 000 zł uporządkowania operacji: 1.1 < 2.1 < 1.2 < 2.2. Zmodyfikuj powyższe transakcje w taki sposób, żeby niezależnie od kolejności operacji w historii współbieżnej tych dwóch sesji, stan salda konta był zawsze poprawny. Zadanie nr 3a Problem do rozwiązania taki jak z zadaniu 3, ale dodatkowo wprowadzone modyfikacje nie mogą blokować transakcji.

Zadanie nr 4 Obydwie sesje realizują operację pobrania określonej kwoty z danego konta. Wykonanie operacje jest możliwe tylko w wypadku, gdy saldo konta jest większe niż pobierana kwota. Przywróć początkowy stan bazy danych Sesja 1: variable saldo_skorygowane number exec select saldo into :saldo from Konta where numer = :nr_konta; exec :saldo_skorygowane := :saldo - 8000 -- if (:saldo 8000 > 0) then begin exec update Konta set saldo = saldo 8000 where numer = :nr_konta; exec select saldo into :saldo from Konta where numer = :nr_konta; exec :saldo_skorygowane := :saldo - 8000 -- 1.3 -- wynikiem powinna być wartość większa niż 0 Sesja 2: exec select saldo into :saldo from Konta where numer = :nr_konta; exec :saldo_skorygowane := :saldo - 5000 -- if (:saldo 5000 > 0) then begin exec update Konta set saldo = saldo 5000 where numer = :nr_konta; uporządkowania operacji: 1.1 < 2.1 < 1.2 < 2.2 < 1.3. Poprawność będzie zapewniona gdy suma przelewów zleconych dla danego konta nie będzie większa niż saldo tego konta.

Zadanie nr 5 Sesje 1 i 2 realizują dwa współbieżne wątki tego samego procesu przyjmowania zleceń przelewu. Przyjęcie przelewu jest możliwe tylko w wypadku, gdy saldo konta pomniejszone o już zaplanowane przelewy jest większe od przelewanej kwoty. Sesja 1: exec :saldo_skorygowane := :saldo_skorygowane - 3000 -- if (:saldo_skorygowane 3000 > 0) then begin insert into Przelewy_zlecone values ( seqpz.nextval, 11111, sysdate, sysdate+1, 55555, 3000) Sesja 2: exec :saldo_skorygowane := :saldo_skorygowane - 3000 -- if (:saldo_skorygowane 4000 > 0) then begin insert into Przelewy_zlecone values ( seqpz.nextval, 11111, sysdate, sysdate+2, 5555, 4000); -- Poprawna wartość > 0 uporządkowania operacji: 1.1 < 2.1 < 1.2 < 2.2. Poprawność będzie zapewniona gdy suma przelewów zleconych dla danego konta nie będzie większa niż saldo tego konta.

Zadanie nr 6 Zagwarantuj poprawne wykonanie transakcji z poprzedniego zadania bez względu na dowolne inne nieznane transakcje, które przetwarzają tę samą bazę danych. Sesja 1: exec :saldo_skorygowane := :saldo_skorygowane - 3000 -- if (:saldo_skorygowane 3000 > 0) then begin insert into Przelewy_zlecone values ( seqpz.nextval, 11111, sysdate, sysdate+1, 55555, 3000) -- Poprawna wartość > 0 -- 1.3 Sesja 2: Dowolna inna transakcja W tym wypadku jest to transakcja, która przyjmuje zlecenie przelewu tylko, jeżeli suma przelewów jest mniejsza od 10 000 zł. variable suma_przelewów number variable kwota_zlecona number exec :kwota_zlecona := 4000 exec select sum(kwota) from Przelewy_zlecone into :suma_przelewów from Konta where -- if (:suma_przelewów + :kwota_zlecona < 10 000 ) then begin insert into Przelewy_zlecone values ( seqpz.nextval, 11111, sysdate, sysdate+2, 5555, :kwota_zlecona); exec select sum(kwota) from Przelewy_zlecone into :suma_przelewów from Konta where print suma_przelewów -- Poprawna wartość < 10 000 uporządkowania operacji: 1.1 < 2.1 < 1.2 < 2.2 < 1.3