/* Problem čitanja nepotvrđenih promena 1. ako ugradimo paket za glavna sa UR nivoom izolovanosti, a nepotvrdjene_promene mogu u bilo kom, prva ce moci da vidi i nepotvrdjene promene druge transakcije 2. ako ugradimo paket za glavna sa CS (ili nekim strozijim) nivoom izolovanosti, a nepotvrdjene_promene mogu u bilo kom, nece se javiti ovaj problem. */ #include #include #include /* ukljucujemo strukturu koja omogucava rad sa BP */ EXEC SQL INCLUDE SQLCA; /* funkcija za obradu greske */ int iserr(char err[]){ if (SQLCODE < 0){ printf("SQLCODE %ld %s\n\n", SQLCODE, err); /* dogodila se greska i ponistavamo transakciju */ EXEC SQL ROLLBACK; return 1; } return 0; } /* za poziv funkcije greske koristice se makro */ #define CHECKERR(s) if (iserr(s)) exit(1); int main(){ char c; /* povezujemo se na BP */ EXEC SQL CONNECT TO vstudd user studentip using Abcdef2013; CHECKERR("Connect"); exec sql update db.ispitni_rok set pocetak_prijavljivanja = pocetak_prijavljivanja + 2 days where oznaka = 'jan' and godina = 2016; if(SQLCODE == -911 || SQLCODE == -913){ printf("Objekat je zakljucan od strane druge transakcije.\n"); printf("Transakcija predugo ceka na katance. Ponistava se! SQLCODE: %ld\n", SQLCODE); EXEC SQL ROLLBACK; } CHECKERR("Update 1"); printf("Promenjen Januar 2016\n"); scanf("%c", &c); exec sql update db.ispitni_rok set pocetak_prijavljivanja = pocetak_prijavljivanja + 2 days where oznaka = 'feb' and godina = 2016; if(SQLCODE == -911 || SQLCODE == -913){ printf("Objekat je zakljucan od strane druge transakcije.\n"); printf("Transakcija predugo ceka na katance. Ponistava se! SQLCODE: %ld\n", SQLCODE); EXEC SQL ROLLBACK; } CHECKERR("Update 2"); printf("Promenjen Februar 2016\n"); scanf("%c", &c); EXEC SQL ROLLBACK; CHECKERR("Rollback"); printf("Ponistene promene\n"); EXEC SQL CONNECT RESET; CHECKERR("Connect reset"); return 0; }