JDBC
Adatb´ aziskapcsolat objektumok
SQL parancsok k¨ uld´ ese
K¨ otegelt m´ odos´ıt´ asok
ResultSet
JDBC adatb´azis-hozz´af´er´es java-ban
Tranzakci´ ok
JDBC
Adatb´ aziskapcsolat objektumok
SQL parancsok k¨ uld´ ese
K¨ otegelt m´ odos´ıt´ asok
ResultSet
Tranzakci´ ok
JDBC
JDBC API: Java nyelven ´ır´odott oszt´alyokat ´es interf´eszeket tartalmaz´o csomagok, melyek egy standard API-t biztos´ıtanak adatb´azis-keretrendszerek, valamint adatb´azis alap´ u alkalmaz´asok fejleszt´es´ere. A JDBC API el˝onye abban ´all, hogy elvileg b´armilyen adatforr´ast el´erhet¨ unk vele b´armilyen platformon, melyen a java virtu´alis g´ep fut. Nem kell teh´at minden adatb´azisszerverre k¨ ul¨ on programot ´ırni, hanem ugyanaz a k´ od m˝ uk¨ odni fog b´armely adatb´azisszerverrel.
JDBC
Adatb´ aziskapcsolat objektumok
SQL parancsok k¨ uld´ ese
K¨ otegelt m´ odos´ıt´ asok
ResultSet
A JDBC alkalmaz´asi ter¨uletei
mire lehet haszn´alni a JDBC-t: 1 2
3
Kapcsolat l´etrehoz´asa egy adatforr´assal (data source) Lek´erdez˝o (select) valamint m´ odos´ıt´ o (insert, update, delete) parancsokat lehet k¨ uldeni az adatforr´asnak A lek´erdez´es eredm´eny´et fel lehet dolgozni
Tranzakci´ ok
JDBC
Adatb´ aziskapcsolat objektumok
SQL parancsok k¨ uld´ ese
K¨ otegelt m´ odos´ıt´ asok
ResultSet
Pl. Context ctx = new InitialContext(); DataSource ds = (DataSource)ctx.lookup("jdbc/MyDB"); Connection con = ds.getConnection("myLogin", "myPassword"); Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM Table1"); while (rs.next()) { int x = rs.getInt("a"); String s = rs.getString("b"); float f = rs.getFloat("c"); }
Tranzakci´ ok
JDBC
Adatb´ aziskapcsolat objektumok
SQL parancsok k¨ uld´ ese
K¨ otegelt m´ odos´ıt´ asok
ResultSet
Tranzakci´ ok
Adatb´aziskapcsolat objektumok (Connection)
Egy Connection objektum egy adatb´aziskapcsolatot testes´ıt meg. Egy adatb´aziskapcsolat-szesszi´ o mag´aba foglalja az SQL parancsokat, amelyek el lesznek v´egezve ´es az eredm´enyek kinyer´es´et a kapcsolaton kereszt¨ ul. Egy alkalmaz´as tartalmazhat egy vagy t¨ obb kapcsolatot egy vagy t¨ obb adatb´azishoz. A kapcsolathoz tartoz´ o adatb´azisr´ ol a Connection.getMetaData() met´odussal kaphatunk inform´aci´ ot. Ez egy DatabaseMetaData objektumot ad vissza, amelyik az adatb´azist´abl´akt´ol, t´arolt elj´ar´asokr´ ol, a kapcsolat tulajdons´agair´ol szolg´altat inform´aci´ okat.
JDBC
Adatb´ aziskapcsolat objektumok
SQL parancsok k¨ uld´ ese
K¨ otegelt m´ odos´ıt´ asok
ResultSet
Kapcsolat l´etrehoz´asa K´et m´odon t¨ort´enhet: 1. DriverManager
2. DataSource
1. DriverManager Klasszikusan a DriverManager.getConnection() met´odus´at haszn´aljuk, mely param´eterk´ent egy URL-t kap. A DriverManager oszt´aly tartalmaz egy list´at a regisztr´alt driverekkel. A getConnection() met´ odus h´ıv´asakor megpr´ ob´alja magtal´alni a megfelel˝o drivert, mely kapcsol´ odni tud az URL-ben megadott adatb´azishoz (sorba kiprob´alja a drivereket, m´ıg egyet tal´al, amely kapcsol´odik a megfelel˝ o URL seg´ıts´eg´evel) Ezt a manager-szintet el lehet ker¨ ulni direkt Driver met´odus h´ıv´as´aval. (csak ritk´an haszn´aljuk, pl. ha k´et driver is van, amelyik hozz´a tud kapcsol´odni egy bizonyos adatb´azishoz ´es explicit szeretn´enk meghat´arozni, hogy melyikkel akarunk kapcsol´odni.)
Tranzakci´ ok
JDBC
Adatb´ aziskapcsolat objektumok
SQL parancsok k¨ uld´ ese
K¨ otegelt m´ odos´ıt´ asok
ResultSet
Pl.: Class.forName("jdbc.odbc.JdbcOdbcDriver"); //loads the driver String url = "jdbc:odbc:myDatabase"; Connection con = DriverManager.getConnection(url, "myUsername", "myPassword");
Tranzakci´ ok
JDBC
Adatb´ aziskapcsolat objektumok
SQL parancsok k¨ uld´ ese
K¨ otegelt m´ odos´ıt´ asok
ResultSet
Tranzakci´ ok
2. DataSource A DataSource interf´esz a DriverManager alternat´ıv´ajak´ent egy kapcsolat l´etrehoz´as´anak az ink´abb aj´anlott m´ odja. El˝onyei: a DataSource-al l´etrehozott kapcsolatok r´eszt vehetnek ”connection pooling”-ban valamint osztott tranzakci´ okban. a DataSource objektum JNDI-n kereszt¨ ul is m˝ uk¨ odik, ´es az alakamaz´ast´ol f¨ uggetlen¨ ul van telep´ıtve ´es l´etrehozva: a JDBC driver tartalmaz egy DataSource implemenet´ aci´ ot, a rendszeradminsztr´ ator regisztr´ alja ezt a JNDI n´evszolg´ altat´ oval, az alkalmaz´ as pedig a JNDI-ben regisztr´ alt DataSource-ot egyszer˝ uen lek´eri n´ev alapj´ an. (Az alkalmaz´ as teh´ at nem kell driver inform´ aci´ okat hardk´ odoljon, hanem egy logikai nevet haszn´ al a DataSource el´er´es´ehez, ´ıgy a DataSource megv´ altoztathat´ o az alkalmaz´ ask´ od m´ odos´ıt´ asa n´elk¨ ul)
JDBC
Adatb´ aziskapcsolat objektumok
SQL parancsok k¨ uld´ ese
K¨ otegelt m´ odos´ıt´ asok
ResultSet
Tranzakci´ ok
Datasource l´etrehoz´asa ´es regisztr´al´asa
A k´od csak illusztr´al´ask´ent szolg´al, tipikusan grafikus eszk¨oz¨okkel ´all´ıtjuk be vagy az alkalmaz´asszerver konfigur´aci´ os f´ajlj´aban. VendorDataSource vds = new VendorDataSource(); vds.setServerName("my database server"); vds.setDatabaseName("my database"); vds.setDescription("the data source for inventory and personnel"); Context ctx = new InitialContext(); ctx.bind("jdbc/MyDB", vds);
JDBC
Adatb´ aziskapcsolat objektumok
SQL parancsok k¨ uld´ ese
K¨ otegelt m´ odos´ıt´ asok
ResultSet
Tranzakci´ ok
Kapcsol´od´as a DataSource-hoz Context ctx = new InitialContext(); DataSource ds = (DataSource)ctx.lookup("jdbc/MyDB"); Connection con = ds.getConnection("myUsername", "myPassword"); A DataSource interf´esz implement´al´asa h´aromf´ele lehet: 1 2
3
Alap DataSource oszt´aly: a driver szolg´altat´ o (vendor) adja DataSource oszt´aly, amelyik ”connection pooling”-et szolg´altat: alkalmaz´asszerver- vagy driverszolg´altat´ o adja. Egy ConnectionPoolDataSource oszt´allyal dolgozik, amit a driver szolg´altat´o ad. DataSource oszt´aly, amelyet osztott tranzakci´ okban haszn´alhatunk: az alkalmaz´asszerver szolg´altat´ o adja (pl. EJB kont´ener szolg´altat´o). Egy XADataSource oszt´allyal dolgozik, amit a drivet szolg´altat´o ad.
JDBC
Adatb´ aziskapcsolat objektumok
SQL parancsok k¨ uld´ ese
K¨ otegelt m´ odos´ıt´ asok
ResultSet
Tranzakci´ ok
Egy alap DataSource-al l´etrehozott kapcsolat-objektum –ak´arcsak a DriverManager-el l´etrehozott– egy fizikai kapcsolat objektumot hoz l´etre ”Connection pooling”-ot implemnt´al´ o DataSource viszont csak egy PooledConnection objektumot ad vissza, amely nem k¨ozvetlen¨ ul egy fizikai kapcsolat objektum. Az alkalmaz´as k´odja ugyan´ ugy haszn´alja fel a kapcsolatobjektumot, f¨ uggetlen¨ ul att´ol, hogy DataSource-b´ ol vagy DriverManager-b˝ol hozzuk-e l´etre, illetve hogy ”pool”-t haszn´al vagy sem. L´enyeges, hogy az alkalmaz´ask´ od egy finally block-ot kell tartalmazzon, biztos´ıtva ez´altal, hogy a kapcsolat bez´ar´odik akkor is, ha hiba t¨ort´ent (kiv´etel dob´ odott). Ez m´eg fontosabb pool-t haszn´al´ o kapcsolatok eset´en, hogy az illet˝o kapcsolatot visszajuttassuk a pool-ba az u ´jb´ ol rendelkez´esre ´all´o kapcsolatok k¨oz´e.
JDBC
Adatb´ aziskapcsolat objektumok
SQL parancsok k¨ uld´ ese
K¨ otegelt m´ odos´ıt´ asok
ResultSet
Pl. try { Connection con = ds.getConnection("user", "secret"); // . . . code to do the application’s work } catch { // . . . code to handle an SQLException } finally { if (con != null) con.close(); }
Tranzakci´ ok
JDBC
Adatb´ aziskapcsolat objektumok
SQL parancsok k¨ uld´ ese
K¨ otegelt m´ odos´ıt´ asok
ResultSet
Tranzakci´ ok
Amint a kapcsolat l´etrej¨ ott, az adatb´azisnak SQL parancsokat k¨ uldhet¨ unk. A JDBC API nem korl´atoz a kiadhat´ o SQL parancsok tekintet´eben: azaz adatb´azis-specifikus vagy ak´ar nem SQL parancsokat is haszn´alhatunk. Azt azonban biztos´ıtanunk kell, hogy az adatb´azis fel tudja dolgozni a parancsokat. Pl. h´ıvhatunk t´arolt elj´ar´asokat egy olyan adatb´azisra, amelyik nem t´amogatja ezeket, de egy kiv´etel fog dob´ odni. A JDBC API h´arom interf´eszt biztos´ıt SQL parancsok k¨ uld´es´ere: 1 2 3
Statement PreparedStatement CallableStatement
JDBC
Adatb´ aziskapcsolat objektumok
SQL parancsok k¨ uld´ ese
K¨ otegelt m´ odos´ıt´ asok
ResultSet
Tranzakci´ ok
Statement Statement A kapcsolat objektum createStatement() met´ odus´aval hozhatjuk l´etre. Ezt param´eter n´elk¨ uli SQL parancsok h´ıv´asa haszn´alja Statement stmt = con.createStatement(); //lek´ erdez´ es: SELECT ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM Table1"); //m´ odos´ ıt´ as: INSERT, UPDATE, DELETE ES DDL (CREATE TABLE, DROP TABLE) int affectedRows = stmt.executeUpdate("UPDATE..."); //t¨ obb resultSet vagy update eset´ eben (ritk´ an haszn´ alt) stmt.execute(...)
JDBC
Adatb´ aziskapcsolat objektumok
SQL parancsok k¨ uld´ ese
K¨ otegelt m´ odos´ıt´ asok
ResultSet
PreparedStatement
A kapcsolat objektum prepareStatement() met´ odus´aval hozhatjuk l´etre. El˝oford´ıtott (precompiled) SQL parancsok h´ıv´as´ara haszn´aljuk. El˝ony¨ok a Statement-hez k´epest: egy vagy t¨obb param´etert adhatunk meg neki. hat´ekonyabb, mert le lesz ford´ıtva ´es ez el lesz mentve. T¨obbsz¨ori felhaszn´al´as eset´en ´erdemes teh´at ezt haszn´alni.
Tranzakci´ ok
JDBC
Adatb´ aziskapcsolat objektumok
SQL parancsok k¨ uld´ ese
K¨ otegelt m´ odos´ıt´ asok
ResultSet
Tranzakci´ ok
Kiterjeszti a Statemant interf´eszt, teh´at ¨ or¨ okli ennek met´odusait, viszont saj´at verzi´okat defini´al az executeQuery, executeUpdate ´es execute met´odusokra. Mivel a Statement objektumok nem tartalmazz´ak az SQL parancsot, ez´ert param´eterk´ent adjuk meg ezt a fenti met´odusoknak. A PreparedStatement objektumok nem adj´ak ´at param´eterk´ent az SQL parancsokat ezeknek a met´ odusoknak, mivel ezek m´ar tartalmazz´ak az SQL parancs el˝ ore leford´ıtott v´altozat´at. Kiv´etel dob´odik, ha PreparedStatement objektum eset´en SQL parancsot adunk ´at param´eterk´ent ezeknek az ¨ or¨ ok¨olt met´odusoknak
JDBC
Adatb´ aziskapcsolat objektumok
SQL parancsok k¨ uld´ ese
K¨ otegelt m´ odos´ıt´ asok
ResultSet
Miel˝ott futtatn´ank a PreparedStatement-et, mindegyik param´eternek ´ert´eket kell adjunk: PreparedStatement pstmt = con.prepareStatement( "UPDATE table1 SET name = ? WHERE id = ?"); pstmt.setString(1, "Joe"); pstmt.setLong(2, 1000); ResultSet rs = pstmt.executeQuery();
Tranzakci´ ok
JDBC
Adatb´ aziskapcsolat objektumok
SQL parancsok k¨ uld´ ese
K¨ otegelt m´ odos´ıt´ asok
ResultSet
CallableStatement
A kapcsolat objektum prepareCall met´ odus´aval hozhatjuk l´etre T´arolt elj´ar´asok h´ıv´as´ara haszn´aljuk.
Tranzakci´ ok
JDBC
Adatb´ aziskapcsolat objektumok
SQL parancsok k¨ uld´ ese
K¨ otegelt m´ odos´ıt´ asok
ResultSet
K¨otegelt m´odos´ıt´asok (Batch Updates) Egy Statement objekum t¨ obb m´ odos´ıt´ o parancsot egy egys´egk´ent (k¨otegelve) k¨ uldhet a szervernek. Ez bizonyos esetekben l´enyeges teljes´ıtm´enyn¨ oveked´eshez vezethet. Pl. Statement stmt = con.createStatement(); con.setAutoCommit(false); stmt.addBatch("INSERT INTO employees VALUES (1000, ’Joe Jones’)"); stmt.addBatch("INSERT INTO departments VALUES (260, ’Shoe’)"); stmt.addBatch("INSERT INTO emp dept VALUES (1000, ’260’)"); int [] updateCounts = stmt.executeBatch();
Tranzakci´ ok
JDBC
Adatb´ aziskapcsolat objektumok
SQL parancsok k¨ uld´ ese
K¨ otegelt m´ odos´ıt´ asok
ResultSet
Tranzakci´ ok
Egy k¨otegen bel¨ ul mindegyik SQL parancs m´ odos´ıt´o kell legyen. Hiba eset´en BatchUpdateException kiv´etel dob´ odik vagy nem dob´odik kiv´etel ´es tov´abb fut a k¨ oteg, de az updateCounts megfel˝o odik. Ez JDBC driver f¨ ugg˝o. elem´ere Statement.EXECUTE FAILED ´ır´ Az eredm´enyt˝ol f¨ ugg˝ oen commit vagy rollback k¨ ovetkezhet. A JDBC driver nem k¨ otelez˝ o, hogy implement´alja a k¨otegelt m´ odos´ıt´asokat. A DatabaseMetaData supportsBatchUpdates tulajdons´aga alapj´an lek´erdezhetj¨ uk.
JDBC
Adatb´ aziskapcsolat objektumok
SQL parancsok k¨ uld´ ese
K¨ otegelt m´ odos´ıt´ asok
ResultSet
Tranzakci´ ok
ResultSet A ResultSet egy Java objektum, amelyik egy SQL lek´erdez´es eredm´eny´et tartalmazza. A k¨ ul¨onb¨oz˝o oszlopokhoz egy soron bel¨ ul set ´es get met´odusokkal f´er¨ unk hozz´a ´es a next met´ odussal megy¨ unk a k¨ ovetkez˝o sorra. Pl. Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM Table"); while (rs.next()) { // retrieve and print the values for the current row int i = rs.getInt("a"); String s = rs.getString("b"); float f = rs.getFloat("c"); System.out.println("ROW = " + i + " " + s + " " + f); }
JDBC
Adatb´ aziskapcsolat objektumok
SQL parancsok k¨ uld´ ese
K¨ otegelt m´ odos´ıt´ asok
ResultSet
Kurzorok
A ResultSet objektum tartalmaz egy kurzort, amelyik az aktu´alis sorra mutat. A ResultSet objektum l´etrehoz´asakor a kurzor az els˝o sor el´e van be´all´ıtva, ´es a next met´ odus els˝ o h´ıv´asa be´all´ıtja az els˝o elemre. G¨ord´ıthet˝o ResultSet-ek eset´eben t¨ obb met´ odust haszn´alhatunk: previous, first, last, absolute, relative, afterLast, beforeFirst
Tranzakci´ ok
JDBC
Adatb´ aziskapcsolat objektumok
SQL parancsok k¨ uld´ ese
K¨ otegelt m´ odos´ıt´ asok
ResultSet
ResultSet t´ıpusok
TYPE FORWARD ONLY: csak el˝ ore g¨ ord´ıthet˝ o TYPE SCROLL INSENSITIVE: el˝ ore-h´atra g¨ ord´ıthet˝o vagy egy konkr´et poz´ıci´ora ´all´ıthat´ o TYPE SCROLL SENSITIVE: ezen k´ıv¨ ul ´erz´ekeli az adatv´altoz´asokat, amelyek az´ota t¨ort´entek, ami´ ota kinyitottuk a ResultSet-et.
Tranzakci´ ok
JDBC
Adatb´ aziskapcsolat objektumok
SQL parancsok k¨ uld´ ese
K¨ otegelt m´ odos´ıt´ asok
ResultSet
Tranzakci´ ok
Konkurencia t´ıpusok
CONCUR READ ONLY: nem m´ odos´ıthat´ o, read-only lock-okat haszn´al, teh´at t¨obb felhaszn´al´ o is hozz´af´erhet az adatokhoz egyid˝oben (read-only lock ak´arh´any lehet ugyanarra az adatra) CONCUR UPDATABLE: a ResultSet m´ odos´ıthat´ o, teh´at a m´odos´ıtott adatokat vissza´ırja az adatb´azisba (write-only lock-okat haszn´al azaz csak egy felhaszn´al´o f´er egyid˝oben hozz´a az adatokhoz)
JDBC
Adatb´ aziskapcsolat objektumok
SQL parancsok k¨ uld´ ese
K¨ otegelt m´ odos´ıt´ asok
ResultSet
Tranzakci´ ok
P´elda k¨ul¨onb¨oz˝o t´ıpus´u ResultSet-ek l´etrehoz´as´ara:
Statement stmt = con.createStatement( ResultSet.TYPE SCROLL SENSITIVE, ResultSet.CONCUR UPDATABLE); ResultSet rs = stmt.executeQuery( "SELECT EMP NO, SALARY FROM EMPLOYEES"); PreparedStatement pstmt = con.prepareStatement( "SELECT EMP NO, SALARY FROM EMPLOYEES WHERE EMP NO = ?", ResultSet.TYPE SCROLL SENSITIVE, ResultSet.CONCUR UPDATABLE); pstmt.setString(1, "1000010"); ResultSet rs = pstmt.executeQuery();
JDBC
Adatb´ aziskapcsolat objektumok
SQL parancsok k¨ uld´ ese
K¨ otegelt m´ odos´ıt´ asok
ResultSet
M´odos´ıt´asok Csak CONCUR UPDATABLE t´ıpus´ u Statement eset´eben haszn´alhat´ok. Pl.1 – M´odos´ıt´as: rs.absolute(4); rs.updateString(2, "321 Kasten"); rs.updateFloat(3, 10101.0f); rs.updateRow(); Pl.2 – M´odos´ıt´as: rs.absolute(4); rs.updateString("ADDRESS", "321 Kasten"); rs.updateFloat("AMOUNT", 10101.0f); rs.updateRow();
Tranzakci´ ok
JDBC
Adatb´ aziskapcsolat objektumok
SQL parancsok k¨ uld´ ese
Pl. – T¨orl´es: rs.first(); rs.deleteRow(); Pl. – Besz´ ur´as: rs.moveToInsertRow(); rs.updateObject(1, myArray); rs.updateInt(2, 3857); rs.updateString(3, "Mysteries"); rs.insertRow(); rs.first();
K¨ otegelt m´ odos´ıt´ asok
ResultSet
Tranzakci´ ok
JDBC
Adatb´ aziskapcsolat objektumok
SQL parancsok k¨ uld´ ese
K¨ otegelt m´ odos´ıt´ asok
ResultSet
Tranzakci´ok
Egy tranzakci´o egy vagy t¨ obb parancsb´ ol ´all, amelyek lefutottak ´es vagy mind sikeresen el lett v´egezve (commit) vagy visszag¨ord¨ ultek (roll back). Mikor egy commit vagy rollback h´ıv´ odik az aktu´alis tranzakci´o befejez˝odik ´es egy u ´j kezd˝ odik. Egy u ´j kapcsolat (Connection) objektum alap´ertelmez´esben ´altal´aban auto-commit m´odban van, ami azt jelenti, hogy a commit met´odus automatikusan megh´ıv´odik a parancs lefut´as´at k¨ ovet˝ oen, azaz a tranzakci´o egyetlenegy SQL parancsb´ ol ´all.
Tranzakci´ ok
JDBC
Adatb´ aziskapcsolat objektumok
SQL parancsok k¨ uld´ ese
K¨ otegelt m´ odos´ıt´ asok
ResultSet
Tranzakci´ ok
A kapcsolat objektumok r´eszt vehetnek osztott tranzakci´okban is (t¨ obb adatb´azisszervert magukba foglal´ o tranzakci´ok). Ehhez azonban a kapcsolat objektumot k¨ otelez˝ oen egy DataSource objektumb´ol kell kinyerj¨ uk, amely u ´gy van implement´alva, hogy egy¨ uttm˝ uk¨odj¨on egy alkalmaz´asszerver osztott tranzakci´os infrastrukt´ ur´aj´aval. Ellent´etben a DriverManager-b˝ ol l´etrehozott kapcsolatokkal, az ilyen DataSource ´altal l´etrehozott kapcsolatoknak az auto-commit m´ odja alap´ertelmez´esben ki van kapcsolva. (A DataSource standard implement´aci´ oja viszont ugyanolyan kapcsolatobjektumokat hoz l´etre, mint amilyet a DriverManager oszt´aly.)
JDBC
Adatb´ aziskapcsolat objektumok
SQL parancsok k¨ uld´ ese
K¨ otegelt m´ odos´ıt´ asok
ResultSet
Tranzakci´ ok
Ha a kapcsolat objektum osztott tranzakci´ oban vesz r´eszt, a tranzakci´o manager hat´arozza meg, hogy a commit ill. rollback met´odusok mikor lesznek megh´ıvva. Ilyenkor teh´at nem h´ıvhatjuk meg k¨ ozvetlen¨ ul ezeket a met´odusokat valamint nem ´all´ıthatjuk az auto-commit m´ odot, mert keresztbe tesz¨ unk a tranzakci´ o manager-nek.
JDBC
Adatb´ aziskapcsolat objektumok
SQL parancsok k¨ uld´ ese
K¨ otegelt m´ odos´ıt´ asok
ResultSet
Tranzakci´ ok
Tranzakci´os elszigetel´esi szintek
Ha egy adatb´azisszerver t´amogatja a tranzakci´ okezel´eseket, m´od van arra, hogy potenci´alis konfliktusokat elker¨ ulj¨ on, melyek abb´ol ad´odnak, hogy k´et vagy t¨ obb tranzakci´ o fut az adatb´azison egyid˝oben. A kapcsolat objektumnak be´all´ıthatjuk a tranzakci´os elszigetel´esi szintj´et, ami megadja, hogy az adatb´azisszerver milyen szinten gondoskodjon a potenci´alis konfliktusok megold´as´ar´ol. Pl. mi t¨ort´enjen akkor, ha egy tranzakci´ o megv´altoztat egy ´ert´eket, ´es egy m´asik olvassa azt miel˝ ott az befejez˝ od¨ ott commit-al vagy rollback-el? Hogy ezt megendedj¨ uk, be´all´ıthatjuk a megfelel˝ o szintet: con.setTransactionIsolation(TRANSACTION READ UNCOMMITTED);
JDBC
Adatb´ aziskapcsolat objektumok
SQL parancsok k¨ uld´ ese
K¨ otegelt m´ odos´ıt´ asok
ResultSet
Tranzakci´ ok
Min´el magasabb az elszigetel´esi szint, ann´al nagyobb hangs´ uly lesz fektetve a konfliktusok elker¨ ul´es´ere, viszont ann´al lass´ ubb lesz a szerver (a megn¨ovekledett z´arak (locks) kezel´ese valamint a felhaszn´al´ok cs¨okkentett p´arhuzamos hozz´af´er´ese miatt). A Connection interf´esz ¨ ot szintet defini´al. A val´odi szintek sz´ama term´eszetesen adatb´azisszerver-f¨ ugg˝o. A setTransactionIsolation met´ odussal be´all´ıthatjuk a kapcsolat elszigetel´esi szintj´et, ´es ez vonatkozik a kapcsolat tov´abbi szesszi´oira.
JDBC
Adatb´ aziskapcsolat objektumok
SQL parancsok k¨ uld´ ese
K¨ otegelt m´ odos´ıt´ asok
ResultSet
Tranzakci´ ok
Savepoints A Savepoint interf´eszt a JDBC 3.0 API vezette be. Egy SavePoint egy k¨ oztes pontot jel¨ ol meg egy tranzakci´on bel¨ ul ´es lehet˝ove teszi, hogy egy tranzakci´ o viusszag¨ ord¨ ulj¨on addig a pontig ahelyett, hogy a teljes tranzakci´ o visszag¨ ord¨ ulj¨ on. Pl.: Statement stmt = con.createStatement(); int rows = stmt.executeUpdate("INSERT INTO AUTHORS VALUES " + "(LAST, FIRST, HOME) ’TOLSTOY’, ’LEO’, ’RUSSIA’"); Savepoint save1 = con.setSavepoint("SAVEPOINT 1"); int rows = stmt.executeUpdate("INSERT INTO AUTHORS VALUES " + "(LAST, FIRST, HOME) ’MELVOY’, ’HAROLD’, ’FOOLAND’"); ... con.rollback(save1);
JDBC
Adatb´ aziskapcsolat objektumok
SQL parancsok k¨ uld´ ese
K¨ otegelt m´ odos´ıt´ asok
ResultSet
Tranzakci´ ok
Egy tranzakci´ohoz t¨ obb Savepoint-ot rendelhet¨ unk. Ezek automatikusan t¨ orl˝ odnek commit vagy teljes roll back eset´eben. Ha egy bizonyos Savepoint-ig g¨ ord´ıt¨ unk vissza, az ut´ana defini´alt Savepoint-ok t¨orl˝odnek. Expliciten is torolhetunk Savepoint-ot: con.releaseSavepoint(save1); Ha egy automatikusan vagy expliciten t¨ or¨ olt Savepoint-ra hivatkozunk, SQLException kiv´etel dob´ odik.