Üye Kayıt Üye Giriş

Transaction ve Undo’nun Gücü (Commit-Rollback-Savepoint)


Transaction ve Undo’nun Gücü (Commit-Rollback-Savepoint)

 

Bir transaction nasıl sonlanır, nedir ve neden önemlidir sorularına cevap arayacağız. Öncelikle “transaction” kelimesini bundan sonra “işlem” olarak analım. Bir işlemi SQL sorgusu yazarak başlatabiliriz ve commit veya rollback göndererek ya da bir DDL komutu çalıştırarak sonlandırabiliriz. Unutmadan hemen belirteyim, bir işlem içerisindeyken bilinçli olarak çıkış yaparsanız yarıda bıraktığınız işlem commit edilir ancak isteğiniz dışında bir sonlandırma olursa da rollback ile işleminiz sonlandırılır. Bir örnek;

01 $ sqlplus ogan/password
02  
03 SQL*Plus: Release 10.2.0.4.0 - Production onTue Dec 28 12:34:00 2010
04  
05 Copyright (c) 1982, 2007, Oracle.  All Rights Reserved.
06  
07 Connected to:
08 Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production
09 Withthe Partitioning, OLAP, Data Mining andReal Application Testing options
10  
11 SQL> set line 100
12 SQL> set pagesize 1000
13 SQL> drop table ogan_deneme purge;
14 droptable ogan_deneme purge
15 *
16 ERROR at line 1:
17 ORA-00942: table orviewdoes not exist
18  
19 SQL> create table ogan_deneme
20 as
21 select * from all_users;
22  
23 Table created.
24  
25 SQL> select tr.XIDUSN "Undo Segment Numarasi", tr.UBAFIL "Undo Blok Adresi", tr.START_TIME "Baslangic Zamani",
26 2  tr.USED_UBLK "Kullanilan Undo Bloklari", tr.USED_UREC "Kullanilan Undo Kayitlari", LOG_IO "Mantiksal I/O", PHY_IO "Fiziksel I/O"
27 from v$transaction tr, v$session se
28 where tr.ses_addr = se.saddr
29 andusername='OGAN';
30  
31 norows selected
32  
33 SQL> select count(*) from ogan_deneme;
34  
35 COUNT(*)
36 ----------
37 126
38  
39 SQL> insert into ogan_deneme
40 select * from ogan_deneme;
41  
42 126 rows created.
43  
44 SQL> select count(*) from ogan_deneme;
45  
46 COUNT(*)
47 ----------
48 252
49  
50 SQL> select tr.XIDUSN "Undo Segment Numarasi", tr.UBAFIL "Undo Blok Adresi", tr.START_TIME "Baslangic Zamani",
51 2  tr.USED_UBLK "Kullanilan Undo Bloklari", tr.USED_UREC "Kullanilan Undo Kayitlari", LOG_IO "Mantiksal I/O", PHY_IO "Fiziksel I/O"
52 from v$transaction tr, v$session se
53 where tr.ses_addr = se.saddr
54 andusername='OGAN';
55  
56 Undo Segment Numarasi Undo Blok Adresi Baslangic Zamani     Kullanilan Undo Bloklari
57 --------------------- ---------------- -------------------- ------------------------
58 Kullanilan Undo Kayitlari Mantiksal I/O Fiziksel I/O
59 ------------------------- ------------- ------------
60 8                2 12/28/10 12:34:30                           1
61 1            15            1

–> Henüz rollback veya commit ile işlemimizi bitirmek istemedik ve derken;

01 SQL> exit
02 Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production
03 Withthe Partitioning, OLAP, Data Mining andReal Application Testing options
04 $ sqlplus ogan/password
05  
06 SQL*Plus: Release 10.2.0.4.0 - Production onTue Dec 28 12:37:40 2010
07  
08 Copyright (c) 1982, 2007, Oracle.  All Rights Reserved.
09  
10 Connected to:
11 Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production
12 Withthe Partitioning, OLAP, Data Mining andReal Application Testing options
13  
14 SQL> select count(*) from ogan_deneme;
15  
16 COUNT(*)
17 ----------
18 252

–> Yaptığımız değişiklik commit edilmiş ve işlemimiz sonlandırılmış. Bu noktada belirtmeliyim ki bu bir OCA sertifikasyon sorusu olarak karşınıza çıkabilir. Bir de diğer yönden bakalım?

01 SQL> insert into ogan_deneme
02 select * from ogan_deneme;
03  
04 252 rows created.
05  
06 SQL> select count(*) from ogan_deneme;
07  
08 COUNT(*)
09 ----------
10 504

–> Bir veri girişinde bulunduk ancak henüz commit veya rollback göndermedik. Tam bu sırada işgüzarlık yapıp yemeğe gittiğimizi düşünelim. Aksi bir veritabanı yöneticisi bunun farkına vardı ve bizim henüz commit veya rollback göndermediğimiz işlemimizi sonlandırmak istedi (çok kızgın);

01 $ sqlplus / as sysdba
02  
03 SQL*Plus: Release 10.2.0.4.0 - Production onTue Dec 28 12:38:52 2010
04  
05 Copyright (c) 1982, 2007, Oracle.  All Rights Reserved.
06  
07 Connected to:
08 Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production
09 Withthe Partitioning, OLAP, Data Mining andReal Application Testing options
10  
11 SQL> select sid, serial# fromv$session where username='OGAN';
12  
13 SID    SERIAL#
14 ---------- ----------
15 1371       7716
16  
17 SQL> alter system kill session '1371,7716';
18  
19 System altered.

–> Bağlantımızı sonlandırdı! Aradan döndüğümüz ise göreceğimiz görüntü;

01 SQL> select count(*) from ogan_deneme;
02 selectcount(*) from ogan_deneme
03 *
04 ERROR at line 1:
05 ORA-00028: your session has been killed
06  
07 SQL> conn ogan/password
08 Connected.
09 SQL> select count(*) from ogan_deneme;
10  
11 COUNT(*)
12 ----------
13 252

–> Çok kötü! Yaptığımız ama commit etmediğimiz değişiklik rollback edilerek, bağlantımızı kaydetmeden önceki durumuna getirilmiş. Olsun diyerek devam ediyoruz;

01 SQL> insert into ogan_deneme
02 select * from ogan_deneme;
03  
04 252 rows created.
05  
06 SQL> savepoint ogan_1;
07  
08 Savepoint created.
09  
10 SQL> insert into ogan_deneme
11 select * from ogan_deneme;
12  
13 504 rows created.
14
Bilgisayar Dershanesi Ders Sahibi;
Bilgisayar Dershanesi

Yorumlar

Yorum Yapabilmek İçin Üye Girişi Yapmanız Gerekmektedir.

ETİKETLER