H.Tonguç Yılmaz - tonguc.yilmaz@gmail.com Oracle Veritabanında İşlem(Transaction) Yönetimine Giriş Oracle Veritabanında Eş Zamanlılık(Concurrency), Tutarlılık(Consistency), Kilitler, COMMIT ve ROLLBACK Süreçleri CETURK Oracle Day etkinliği Bahçesehir Üniversitesi 04/11/2010 http://www.troug.org H.Tonguç Yılmaz - tonguc.yilmaz@gmail.com http://friendfeed.com/TongucY
http://tonguc.wordpress.com/about/ H.Tonguç Yılmaz: Oracle veritabanı uzmanı - iyi bir Fenerbahçe taraftarı - Metal müzik sever - Bol bol DVD izler vs. Fethiye Lisesi, İTÜ Bilgisayar Müh., Bilgi MBA C Developer, Informix DBA-Hp Unix Admin, Oracle DBA, Oracle ETL Developer, DW Development Team Leader 1996 Tekstilbank, 2000 Turkcell, 2008 Turkcell Teknoloji 10+ sene Oracle veritabanı tecrübesi, Oracle 8i,9i,10g OCP, 2007 Oracle ACE, 2005 Oracle blogger 2002 Turkcell Akademi Oracle veritabanı iç eğitmeni, 2002 TTech Paf koçu 1999 OracleTurk moderatör, 2010 TROUG kurucu üye http://tonguc.wordpress.com/about/ ’Gerçek görüldüğü gibi değildir. Gerçek hikaye, çok ve düzenli çalışmayla oluşturulmuştur. Bir gecede ünlü olduğunu düşündüğümüz müzik grubu, 7 senedir farklı barlarda birlikte çalışmaktadır. 16. Albümlerinde harikaları yakalayabilmişlerdir. Bu işin sırrı, 10.000 saattir. Herhangi bir işte başarıyı yakalamak için bu kadar zaman çalışmalısınız. Bu denklem, her gün 4 saat çalışarak, 10 seneye eşittir.’ Malcolm Gladwell http://blog.turkcell.com.tr/2009/09/12/inovasyonu-yeniden-kesfetmek/
Akıl’ın hislere/tahminlere/önyargılara karşı mücadelesi.. Öncelikle, hangi tarafta olacağına karar vermelisin Akıl’ın hislere/tahminlere/önyargılara karşı mücadelesi.. Çalışma hayatında bu tarz cümlelere dikkat : Bence .. İddia ederim .. Düşünüyorum .. Hissediyorum .. Tahmin ediyorum .. Çalışmalarını sayılarla ifade edebileceğin sonuçlara dayandır, tekrarlanabilir denemeler hazırla. Herşey bu dünyada ispat edilebilir ve zarar görmemek için de edilmelidir, çalıştığın kişileri bu anlamda zorla.
Neden bu konu ‘ Transactions: Transactions are a fundamental feature of all databases – they are part of what distinguishes a database from a file system. And yet, they are often misunderstood and many developers do not even know that they are accidentally not using them. ‘ ‘ Locking & Concurrency: Different databases have different ways of doing things (what works well in SQL Server may not work as well in Oracle) and understanding how Oracle implements locking and concurrency control is absolutely vital to the success of your application. ‘ Expert Oracle Chapter 4 & 5, Thomas Kyte - http://asktom.oracle.com
Balığı kendin tutabilirsin – Ücretsiz Dökümanlar
Balığı kendin tutabilirsin – Ücretsiz Ortamlar Oracle Database 10g Express Edition(Oracle XE) is a great starter database for Developers working on PHP, Java, .NET, XML, and open source applications. Free to develop, deploy, and distribute Fast to download, simple to install and simple to administer. Entry-level, small-footprint database based on the Oracle Database 10g Release 2 code base http://oss.oracle.com/ Oracle SQL Developer is a free graphical tool for database development. you can browse database objects, run SQL statements and SQL scripts, edit and debug PL/SQL statements. http://sqldeveloper.oracle.com/ Yeni başlayan Oracle Developer veya DBA için çok daha fazlası OTN başlangıç portalinde: http://www.oracle.com/technology/getting-started/index.html
Oracle kısa tarihçe 1978 Oracle V1; pazardaki ilk *satış* amaçlı ilişkisel SQL veritabanı yönetim sistemi …. 1980 Oracle V3; Transactions 1984 Oracle V4; Read Consistency 1986 Oracle V5; Distributed Queries 1989 Oracle V6; Row Level Locking … 7.3 1996 8.0 1997 Oracle 8 8.1.5 1999 Oracle 8i Release 1 8.1.6 1999 Oracle 8i Release 2 8.1.7 2000 Oracle 8i Release 3 9.1 2001 Oracle 9i Release 1 9.2 2002 Oracle 9i Release 2 10.1 2004 Oracle 10g Release 1 10.2 2005 Oracle 10g Release 2 ( XE ! ) 11.1 2007 Oracle 11g Release 1 11.2 2009 Oracle 11g Release 2 ( XE ? ) http://www.oracle.com/timeline/index.html
Veritabanı İşlemleri(Transactions) Veritabanı işlemleri, bir bağlantıdan işletilen bir küme - birbiri ile anlam kazanan veri işletme dili(Data Manuplation Language-DML) cümlesidir. Alttaki SQL cümlelerinden biri ile başlar: INSERT UPDATE DELETE MERGE SELECT FOR UPDATE LOCK TABLE COMMIT veya ROLLBACK tamamlanır.
Veritabanı İşlemleri(Transactions) – Bitirme Yöntemleri COMMIT veya ROLLBACK Bağlantı kapama Normal bir şekilde kapatıldı ise kullanılan istemci ayarlarına göre hareket edilir Anormal bir şekilde kapatıldı ise ROLLBACK işlemi gerçekleştirilir Veri tanımlama dili(Data Definition Language-DDL: CREATE, ALTER, DROP, TRUNCATE, RENAME gibi) cümleleri kullanıldığında DML’leri takip eden DDL cümleleri veritabanı işlem mantığınızı kırar, çünkü DDL çalıştırma aşamasının ilk adımı örtülü bir COMMIT’dir. * * Notlar kısmında DDL için sözde kod(pseudo) ve örneğe göz atınız. http://tonguc.wordpress.com/2007/01/28/somethings-never-change-be-carefull/
Veritabanı İşlemleri(Transactions) – Basit Örnek SQL> UPDATE hr.employees SET salary=salary; 107 rows updated. SQL> SELECT XID, STATUS FROM V$TRANSACTION; XID STATUS ---------------- ---------------- 0800090033000000 ACTIVE SQL> ROLLBACK; Rollback complete. SQL> SELECT XID FROM V$TRANSACTION; no rows selected SQL> UPDATE hr.employees SET last_name=last_name; 107 rows updated. SQL> SELECT XID, STATUS FROM V$TRANSACTION; XID STATUS ---------------- ---------------- 0900050033000000 ACTIVE
ACID Özellikler Atomicity: Bir veritabanı işlemi bir bütün olarak ya gerçekleşir ya da gerçekleşmez (A transaction either happens completely, or none of it happens) * Consistency: Bir veritabanı işlemi veritabanını tutarlı bir noktadan diğer bir tutarlı noktaya taşır. (A transaction takes the database from one consistent state to the next) Isolation: Bir veritabanı işlemi COMMIT ile sonuçlanana kadar yaptıkları diğer oturumlarda görünür değildir. (The effects of a transaction may not be visible to other transactions until the transaction has committed) Durability: Başarı ile COMMIT edilmiş bilgisi alınan bir veritabanı işlemi kalıcıdır, kaybedilemez. (Once the transaction is committed, it is permanent) * Notlar kısmında Oracle veritabanında Atomicity örneklerine göz atın. http://tonguc.wordpress.com/2007/01/13/oracle-concepts-and-architecture-part-3/
Veritabanı İşlemleri(Transactions) Denetim Cümleleri COMMIT: Veritabanı işlemini sonlandırır, değişiklikleri kalıcı kılar. ROLLBACK: Veritabanı işlemini sonlandırır, değişiklikleri geri sarar. SAVEPOINT: Bir veritabanı işlemi içinde işaretli noktalar yaratmak için kullanılır, birden fazla işaret noktası yaratılabilinir ROLLBACK TO <SAVEPOINT>: Belirtilen işaretli noktaya geri sarma için kullanılır. SET TRANSACTION: Birçok veritabanı işlem özelliğinin(sadece okuma gibi) değiştirilmesi için kullanılabilir. Elle geri sarma yönetimi(Manual Rollback Segment Management) kullanılan veritabanlarında bir veritabanı işlemine belirli bir alanı kullanmaya zorlanmak için kullanılırdı.
Dağıtık(Distributed) Veritabanı İşlemleri(Transactions) ve İki Aşamalı COMMIT(Two Phase Commit-2PC) İstemci Onay Uzaktaki sunucu 1 COMMIT; ? Uzaktaki sunucu 2 ? Onay Ana Oracle Veritabanı 2PC – Two Phase Commit: In distributed transactions, Transparent to user. First phase: All the servers are put in pre-commit status (some of them may abort). Second phase: If all the servers are in pre-commit, all of them commit otherwise all of them roll back. RECO process resumes in-doubt 2PC’s (network failures etc..) Limits in a distributed transaction You cannot issue a COMMIT over a database link, you may only commit from the site that initiated the transaction You cannot do DDL over a database link, because DDL commits You cannot issue a SAVEPOINT over a database link, in shortly, you cannot issue any transaction control statements over a database link If you need DDL in a distributed transaction, you can use remote server’s DBMS_JOB supplied package, We use a link to schedule a job to be executed for a DDL, then it will work locally in remote server Dağıtık işlem başarı ile tamamlandı.
Başarım(Performance) ve Ölçeklenirlik(Scalability) Kavramları “Performance is interested with avoiding unnecessary work on limited system resources, where as Scalability is interested with avoiding blocking others doing same operations(serialization). These need different attentions, especially second is very important for heavy loaded OLTP systems. Sometimes you may sacrifice in one to gain in other.” * * Memory Management and Latching Improvements in Oracle9i and 10g Presentation, Tanel Põder
Eş zamanlılık(Concurrency) ve Kilit Kavramları Gerçek yaşamda tek kullanıcısı olan veritabanı uygulamaları geliştirmiyoruz. Çok kullanıcılı sistemlerde aynı kaynaklara aynı anda ulaşmını düzenleme önemli bir konudur. Eş zamanlılık, birçok kullanıcının veriye ulaşımının uyumu-düzeni ile ilgilidir. Bu düzen Kilit kullanımı ile yönetilir, ama kilit miktarı-seviyesi arttıkça veritabanı uygulamasının ölçeklenirliği düşer, dolayısı ile düzen en az kilit ile korunmalıdır. Oracle veritabanı ile yüksek eş zamanlı veritabanı uygulamaları geliştirebilirsiniz, siz koruma düzenini-kilitleri bilinçli arttırmadıkça Oracle veritabanı özdevimli(automatic) olarak en düşük kilit koruma düzeyi ile düzeni korur; 1- Okuyucular, aynı kaynaklar için diğer okuyucuları beklemez. 2- Yazıcılar da aynı kaynaklar için diğer okuyucuları beklemez. 3- Yazıcılar diğer yazıcıları sadece aynı *anda* aynı *satır*ları değiştirmek istediklerinde beklerler.* * Notlar kısmında özel durum örneklerine göz atın. http://tonguc.wordpress.com/2007/10/04/oracle-concepts-and-architecture-part-5/
Kilit Kavramları Detaylar Yaratılan kilitler COMMIT veya ROLLBACK buyruklarından biri veritabanı işlemi sonlanana dek canlı tutulur. DML kilitleri satırlar ve veriyi korurken, DDL kilitleri çizem(schema) nesnelerini korur. Dışlayan(Exclusive) kilitler, ilgili kaynakların paylaşımı engelleyen kilit tipidir. Paylaşılan(Shared) kilitler, ilgili kaynakların paylaşımına izin veren kilit tipidir. Kilit dönüştürme(Conversion), daha alçak seviye koruma düzeyine geçiş sorun yaratmaz iken daha yüksek koruma düzeyi talepleri için bekleme yaşanabilir. Kilit artırımı(Escalation), Oracle veritananında kilit arttırımı yapılmaz çünkü kilitler Oracle veritabanından kısıtlı bir kaynak değildir. Başka veritabanlarında durum; satır kilitleri artınca -> sayfa bazında kitle -> çizelgenin(table) tamamını kitle Ölçeklenirlik için ölümcül bir davranış, çıkmaz kilit(Deadlock) oluşumuna yol açar
REDO ve UNDO kavramları DBA’in en önemli görevi kesinti oluşmasını engellemek, kesin oluşursa en kısa sürede veritabanını çalışır hale geri getirmektir. REDO bilgisi geri dönüş(Recovery)için ciddi önem taşır. Veri kaybı yaşanmaması gereken veritabanları için REDO dosyaları arşivlenmelidir. Her satır için o işlemin tekrar yapılabileceği bilgiler REDO, geri alınabileceği bilgiler de UNDO olarak Oracle veritabanı tarafından yaratılır. UNDO içinde sadece tablo değil ilgili tüm nesnelere ait geri alma bilgileri saklanır. UNDO üretimi de REDO üretilir ve korunur. INSERT INTO t (x,y) VALUES (1,1); UPDATE t SET x = x+1 WHERE x = 1; DELETE FROM t WHERE x = 2; DELETE sonrasında başarıyla COMMIT ettiğimiz durumu tartışalım. DELETE sonrasında başarıyla ROLLBACK ettiğimiz durumu tartışalım. UPDATE sonrasında veritabanı kontrolsüz(ABORT) kapanırsa ne olur tartışalım.
REDO ve UNDO kavramları Data Buffer Cache Redo Log Buffer Undo Index Table Redo
ONLINE REDO ve ARCHIVED REDO LGWR LGWR 1a 2a 3a X:/ 1b 2b 3b Y:/ LGWR ARC ARC ARC ARCH Z:/
ONLINE REDO ve ARCHIVED REDO LGWR LGWR Disk1 1a 3a 1b 3b Disk2 Disk3 2a 4a 2b 4b Disk4 LGWR LGWR ARC ARC ARC ARC ARCH Disk5 ARCH Disk6
COMMIT Oracle için, COMMIT hızlı bir işlemdir, çünkü o ana kadar veritabanı gerekli ön hazırlığı iyimser bir şekilde yapmıştır. Bir veritabanı uygulama geliştiricisi COMMIT sürecini anlamalıdır, ortalıkta birçok ‘efsane’ dolaşır - daha sık COMMIT etmek, COMMIT süresine olumlu etkileMEZ. # of rows inserted Time to INSERT (secs) Time to COMMIT (secs) Redo Generated (bytes) 9 .06 .00 1,512 99 11,908 999 .05 115,924 9,999 .46 1,103,524 99,999 16.36 11,220,656
ROLLBACK Oracle için, ROLLBACK ise daha yavaş ve pahallı bir işlemdir, çünkü o ana kadar yapılan tüm hazırlığın cidden geri alınması gerekir. Uygulamalarınızda ROLLBACK yazarken bir daha düşünün : timeCOMMIT << timeROLLBACK # of rows inserted Time to INSERT (secs) Time to ROLLBACK (secs) Redo Generated (bytes) 9 .06 .02 1,648 99 .04 .00 12,728 999 .01 122,852 9,999 .94 .08 1,170,112 99,999 8.08 4.81 11,842,168
Kötü Veritabanı İşlemi(Transaction) Alışkanlıkları Oracle için, bir veritabanı işlemi olması gerektiği kadar uzun olabilir, işlem mantığına uygun olarak COMMIT edilmesi gerektiği anda bitirilebilir. BEGIN FOR x IN ( SELECT rowid rid, object_name FROM t4 ) LOOP UPDATE t4 SET object_name = lower(x.object_name) WHERE rowid = x.rid; IF ( MOD(x.r, 100) = 0 ) THEN COMMIT; END IF; END LOOP; END; / UPDATE t4 SET object_name = LOWER(object_name); COMMIT; Operation Row Affected Total Redo (no COMMITs) (with COMMITs) % increase INSERT 200 rows 200 442,784 530,396 20% UPDATE 200 rows 849,600 956,660 13% DELETE 200 rows 469,152 537,132 14%
Kötü Veritabanı İşlemi(Transaction) Alışkanlıkları Dikkat, Java Database Connectivity(JDBC) AUTOCOMMIT özelliği ön değeri TRUE ayarlıdır. İşlemlerinizin denetimini ele geçirmek için FALSE ayarlamalısınız. pstmt.setLong(1,2345); pstmt.setString(2,”Sam”); pstmt.execute(); pstmt.setLong(1,2346); pstmt.setString(2,”Steve”); pstmt.execute(); pstmt.setLong(1,2347); pstmt.setString(3,”Scott”); pstmt.execute(); connection.setAutoCommit(false); pstmt.setLong(1,2345); pstmt.setString(2,”Sam”); pstmt.execute(); pstmt.setLong(1,2346); pstmt.setString(2,”Steve”); pstmt.execute(); pstmt.setLong(1,2347); pstmt.setString(3,”Scott”); pstmt.execute(); connection.commit(); commit commit commit
Kötü Veritabanı İşlemi(Transaction) Alışkanlıkları Katmanlı yapıda kim işlemi yönetecek ve sonlandıracak? B içinde COMMIT veya ROLLBACK geçiyor ise, ya da A için AUTOCOMMIT TRUE kaldı ise: Java Procedure A PL/SQL Procedure B PL/SQL Procedure C Not: Özerk (Autonomous) veritabanı işlemleri ile PL/SQL blokları içindeki COMMIT veya ROLLBACK çağırımlarından dış blokların etkilenmemesi sağlanabilir. * Locking & Autonomous Transactions http://tonguc.wordpress.com/2007/02/25/oracle-best-practices-part-2/
Ürettiğim REDO miktarını nasıl ölçebilirim Bir tabloya INSERT – UPDATE – DELETE işlemleri gönderek COMMIT veya ROLLBACK çalıştırmadan REDO üretimini bu basit görüntü yardımı ile ölçebiliriz. CREATE OR REPLACE VIEW redo_size AS SELECT value FROM v$mystat ms, v$statname sn WHERE ms.statistic# = sn.statistic# AND sn.name = 'redo size';
REDO üretimini kapatabilir miyim Oracle veritabanında TEMPORARY TABLE seçeneğini kullanarak REDO üretimini kısıtlayabilirsiniz, UNDO üretimi ROLLBACK edebilmek için yine yaratılacaktır. * Oracle veritabanında sadece bazı özel işlemler NOLOGGING seçeneği ile yapılabilinir. * Index creations and ALTERs (rebuilds) Bulk INSERTs using a ‘direct path insert’ via the /*+APPEND */ hint LOB operation (updates to large objects do not have to be logged Table creations via the CREATE TABLE AS SELECT Various ALTER TABLE operations such as MOVE and partition SPLIT TRUNCATE (but it does not need a NOLOGGING clause, as it is always in NOLOGGING mode) * Notlar kısmında REDO üretim maliyetleri ve TEMPORARY TABLE örneklerine göz atın. Oracle Veritabanı Seçenekleri ile Veri Ambarına Aktarımı İyileştirme: http://blog.turkcell.com.tr/tag/oracle/ Oracle Temporary Tables: http://tonguc.wordpress.com/2006/12/30/29/
Oku, dene, sorgula, geliştir, *paylaş* .. Kaynakça – Turkcell Staj Transactions-Redo/Undo sunumu, Ergin Erant, http://bhatipoglu.com Expert Oracle Chapter 4,5 Thomas Kyte, http://asktom.oracle.com Oracle® Database Concepts 11g Release 2 (11.2) @ http://tahiti.oracle.com Chapter 10 Transactions http://download.oracle.com/docs/cd/E11882_01/server.112/e16508/transact.htm#g11401 Chapter 9 Data Concurrency and Consistency http://download.oracle.com/docs/cd/E11882_01/server.112/e16508/consist.htm#g43931 Çok daha fazlası için * – Transaction Internals, Julian Dyke http://www.juliandyke.com/Presentations/Presentations.html Oracle Concepts and Architecture Series @ tonguc.wordpress.com Part 3: How Atomicity is implemented on Oracle http://tonguc.wordpress.com/2007/01/13/oracle-concepts-and-architecture-part-3/ Part 4: Overview of Transaction Management Internals http://tonguc.wordpress.com/2007/10/01/oracle-concepts-and-architecture-part-4/ Part 5: Concurrency versus Locking Concepts, Understanding Lock Contention with Examples http://tonguc.wordpress.com/2007/10/04/oracle-concepts-and-architecture-part-5/ * Bu sunum giriş düzeyi için tasarlandı, ikinci bir ileri seviye sunumuna hazırlanacağım, Türk Oracle Kullanıcı Grubu – Veritabanı Geliştirme Özel İlgi Grubu buluşmasında çok yakında
Sorularınız ve/veya yorumlarınız Senelerdir bilgi paylaşımına fırsat yarattığı için CETURK’e çok teşekkürler ? ? ? ? ? Sorularınız ve/veya yorumlarınız ? ? ? ? H.Tonguç Yılmaz - tonguc.yilmaz@gmail.com http://friendfeed.com/TongucY