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.