- 1.
- http://www.cs.put.poznan.pl/jjezierski/rsbd/tutorial1.pdf
- mkdir /var/lib/pgsql/rsbd1
- initdb /var/lib/pgsql/rsbd1
- mkdir /var/lib/pgsql/rsbd2
- initdb /var/lib/pgsql/rsbd2
- RAPORT
- pg_ctl -D /var/lib/pgsql/rsbd1 -l logfile start
- pg_ctl -D /var/lib/pgsql/rsbd2 -l logfile start
- RAPORT
- 2.
- psql -p 5432
- \set PROMPT1 '%n@RSBD1:%>%# '
- psql -p 5433
- \set PROMPT1 '%n@RSBD2:%>%# '
- CREATE EXTENSION postgres_fdw;
- \i ~/pracownicy.sql
- \i ~/zespoly.sql
- CREATE SERVER rsbd2 FOREIGN DATA WRAPPER postgres_fdw OPTIONS (host 'localhost', port '5433', dbname 'postgres');
- CREATE USER MAPPING FOR postgres SERVER rsbd2 OPTIONS (user 'postgres');
- IMPORT FOREIGN SCHEMA public LIMIT TO (zespoly) FROM SERVER rsbd2 INTO public;
- SELECT * FROM zespoly;
- SELECT nazwisko, nazwa FROM pracownicy natural join zespoly;
- CREATE SERVER rsbd1 FOREIGN DATA WRAPPER postgres_fdw OPTIONS (host 'localhost', port '5432', dbname 'postgres');
- CREATE USER MAPPING FOR postgres SERVER rsbd1 OPTIONS (user 'postgres');
- IMPORT FOREIGN SCHEMA public LIMIT TO (pracownicy) FROM SERVER rsbd1 INTO public;
- 3.
- begin;
- update zespoly set adres='PIOTROWO 1' where id_zesp=10;
- update pracownicy set placa_pod=999 where id_prac=100;
- commit;
- Tak, posiadaja zmiany.
- pg_ctl -D /var/lib/pgsql/rsbd1 -l logfile restart
- pg_ctl -D /var/lib/pgsql/rsbd2 -l logfile restart
- \c "port=5432"
- \c "port=5433"
- begin;
- update pracownicy set placa_pod=888 where id_prac=100;
- begin;
- update zespoly set adres='PIOTROWO 99' where id_zesp=10;
- PREPARE TRANSACTION 'distributed-transaction01-rsbd1';
- pg_ctl -D /var/lib/pgsql/rsbd2 stop
- PREPARE TRANSACTION 'distributed-transaction01-rsbd2';
- pg_ctl -D /var/lib/pgsql/rsbd1 stop
- pg_ctl -D /var/lib/pgsql/rsbd1 -l logfile start
- pg_ctl -D /var/lib/pgsql/rsbd2 -l logfile start
- \c "port=5432"
- select * from pg_prepared_xacts;
- \c "port=5433"
- select * from pg_prepared_xacts;
- ROLLBACK PREPARED 'distributed-transaction01-rsbd1';
- begin;
- update pracownicy set placa_pod=888 where id_prac=100;
- begin;
- update zespoly set adres='PIOTROWO 99' where id_zesp=10;
- PREPARE TRANSACTION 'distributed-transaction01-rsbd1';
- PREPARE TRANSACTION 'distributed-transaction01-rsbd2';
- pg_ctl -D /var/lib/pgsql/rsbd1 stop
- pg_ctl -D /var/lib/pgsql/rsbd2 stop
- pg_ctl -D /var/lib/pgsql/rsbd1 -l logfile start
- pg_ctl -D /var/lib/pgsql/rsbd2 -l logfile start
- Zarowno dla rsbd1 jak i rsbd2 zapytanie ` select * from pg_prepared_xacts;` zwraca transakcje w statusie PREPARED
- 4.
- begin;
- update pracownicy set placa_pod=placa_pod+10 where id_prac=100;
- begin;
- update zespoly set adres='PIOTROWO 88' where id_zesp=10;
- update zespoly set adres='PIOTROWO 77' where id_zesp=10;
- update pracownicy set placa_pod=placa_pod+10 where id_prac=100;
- 4.9: Nastpil rollback
- 4.12
- rsbd1:
- begin;
- SELECT * FROM pracownicy where id_prac=100 FOR UPDATE NOWAIT;
- update pracownicy set placa_pod=placa_pod+10 where id_prac=100;
- SELECT * FROM zespoly FOR UPDATE NOWAIT;
- update zespoly set adres='PIOTROWO 77' where id_zesp=10;
- rsbd2
- begin;
- SELECT * FROM zespoly FOR UPDATE NOWAIT;
- update zespoly set adres='PIOTROWO 88' where id_zesp=10;
- SELECT * FROM pracownicy FOR UPDATE NOWAIT;
- update pracownicy set placa_pod=placa_pod+10 where id_prac=100;
- Niestety przy transakcji rozproszonej `FOR UPDATE NOWAIT` nie dziaa. Nadal wystpuja zakleszczanie si transakcji.
- 5.
- CREATE MATERIALIZED VIEW zespoly_replika AS SELECT * FROM zespoly;
- update zespoly set adres='PIOTROWO 43' where id_zesp=10;
- REFRESH MATERIALIZED VIEW zespoly_replika;
- 5.6
- Perspektywa musi byc odswiezana poprzez wywolanie komendy. Nie wiadomo czy dane zostaly zmienione, nalezy wykonywac cykliczne odswiezenia.