# ACID (Atomicity, Consistency, Isolation, Durability) İliÅkisel veri tabanı yönetim sistemleri mimarisinde iÅ süreci (transaction) ve veri bütünlüÄünü saÄlamak için uyulması gereken kurallara ACID denilmektedir. İŠsüreci (transaction) kavramı bir iÅleminin ya bütünüyle yapılmasını ya da yapılan iÅlemlerin bütünüyle geri alınıp veri tutarlılıÄın saÄlanmasını garanti altına demektir. **ACID** ne zaman ihtiyaç duyulur ? ACID iÅlem tabanlı veritabanı ilkeleri olarak tasarlanmıÅtır. Yani verilerin bir tür baÅarısızlık sonucunda bozulmamasını saÄlamak için veritabanı iÅlemlerinin uyması gereken ilkeleri saÄlar. Transaction, bir veya daha fazla adımdan oluÅan tek bir mantıksal iÅlemdir. ÃrneÄin banka hesapları arasında para transferi (bir hesabın borçlandırılması ve diÄerinin kredilendirilmesi gibi) bir iÅlemdir. Böyle bir iÅlem olduÄunu varsayalım, eÄer yarısında baÅarısız olursa, büyük problemlere sebep olabilir. Yani ilk hesaptan para çekilebilir ve diÄer hesaba aktarılamayabilir. İÅte ACID ilkeleri bu noktada uyulması gerekir. AÅaÄıda ise bu anlatılanların bir örneÄi verilmiÅtir. **ÃrneÄin**, hesabınızda 100 TLâyi arkadaÅınızın hesabına havale yoluyla göndermek istiyorsun diyelim. Bu iÅ süreci (transaction) iki iÅlem parçasından oluÅur. 100 TL senin hesabından azaltılıp sana ait bakiye bilgileri güncellenir, ardından 100 TL arkadaÅın hesabına +100 olarak iÅlenir ve güncellenir. İÅte bu iÅlem bütünlüÄü garanti altına alınmalıdır. Alınamaz ise tutarsız verilerle karÅılaÅılır. Böylece veri bütünlüÄü bozulur. EÄer sizden 100 TL çektikten sonra bir hata oluÅursa ve arkadaÅınızın hesabına bu ücret yatırılamaz ise tutarsız bir durum oluÅacaÄı aÅikardır. Yine mülakatlarda size soru olarak gelebilecek bir bilgidir. ACIDâi açıklayabilmek ve mantıÄını anlamak gerekir. **ACID** tanımına göre Åunu söyleyebiliriz. Bir veritabanı ancak baÅarılı transaction sonuçlarını içeriyorsa tutarlıdır. **ACID** uyumlu herhangi bir veritabanı, sadece baÅarılı transactionların iÅlenmesini saÄlayacaktır. EÄer bir transaction tamamlanmadan önce bir problem oluÅursa hiçbir veri deÄiÅtirilemeyecektir. Böylece, **ACID** uyumlu DBMS (Database Management System)'ler transaction iÅleminde bir sorun oluÅsa bile bu yapıyı kullananlara veri bütünlüÄünü koruyacaÄına dair bir güven saÄlamıŠoluyor. ## Hata Türleri Transaction Hatası (Transaction Failure) : Hatalı giriÅ veya baÅka tutarsız bilgi nedeniyle bir transaction hatası oluÅabilir.DBMS'de ki (Database Management System) zaman aÅımı veya kilitlenmelerde olabilir. Sistem Hatası (System Failure) : DBMS (Database Management System)'de bir kod hatası Sistem hatasına neden olabilir. Ya da bir donanım problemide olabilir. Ortam Hatası (Media Failure) : Bir depolama cihazından yazamama veya okuyamama durumunu ifade eder. Ortamdan ve iÅletim sisteminden kaynaklanıyor olabilir. Ortam hatası, Transaction ve Sistem hatasına göre daha nadir olan bir hata türüdür. ## ACID UyumluluÄu R-DBMS (Relational Database Management System) ' ler ACID ilkelerine sahiptir. Verilerin yazılımsal veya donanımsal problemleri oluÅtuÄunda veya baÅarısız iÅlemlerde tutarlı olmasını saÄlayan özellikler içerir. NoSQL veritabanları ise biraz farklı bir yapıdadır. Yani NoSQL veritabanları genellikle bir kümede kullanılabilirlik saÄlamak için tasarlanır. Tutarlılık ve dayanıklılık bir noktaya kadar feda ediliyor demektir. ÃoÄu NoSQL DBMS bir seviyeye kadar atomiklik saÄlıyor. ÃoÄu NoSQL DBMS tutarlı bir yapıda çalıÅır. Veriler bir süre için senkronize olmayabilir. Ancak sonunda senkronize olacaktır. MarkLogic, OrientDB ve Neo4j gibi NoSQL veritabanı türleri ACID uyumlu bir yapı sunarlar. ## Atomicity (Bölünmezlik) Bir iÅ sürecinde (transaction) yapılacak iÅlemler sıralı bir Åekilde birden fazla olabilir. Veri tabanında yapılacak olan bu iÅlemler kümesi bir bütün olarak ele alınır. Yapılan iÅlemlerinden herhangi bir tanesi tamamlanamaz ise diÄer tüm iÅlemlerde geçersiz sayılmalıdır. EÄer böyle hatalı bir durum varsa o ana kadar yapılan tüm iÅlemler geri alınır. Fakat, iÅlemlerin hepsi baÅarılı ise o iÅ süreci sonlandırılır. İÅlemin kısmen bilinmeyen bir duruma kadar tamamlandıÄı servis talepleri oluÅturarak çökmeleri ve kesintileri önlemek için kullanıÅlıdır. Atomik olmayan bir iÅlem sırasında bir problem oluÅursa, iÅlem kesintiye uÄramadan önce ne kadar ilerlendiÄi bilinemez. Atomicity (Bölünmezlik) kullanılarak iÅlemin tamamının baÅarıyla tamamlandıÄından veya hiçbirinin tamamlanmadıÄından emin olunur. ## Consistency (Tutarlılık) Veri tabanında yapılan iÅlemlerde hep aynı girdiler ile hep aynı çıktıları almalıyız. İÅte bu tutarlılıÄı gösterir. Aslında veri bütünlüÄü kısıtlamalarının sürdürülmesi anlamına gelir. Tutarlı bir iÅlem de, veri tabanı kuralları ile bütünlük kısıtlamalarını ihlal edemeyecektir.TutarlılıÄı zorunlu hale getirmek (veri bütünlüÄü kısıtlamalarının ihlal edilmesi ile) ilerleyen süreci durdurmayı ve deÄiÅikliklerin yasal duruma geri döndürülmesi saÄlanır. Her iÅlem de veri tabanı içinde tutarlılık saÄlamanın bir baÅka yöntemi de, veri tabanına yerleÅtirilen bildirime dayalı kısıtlamaları uygulamaktır. Ãrnek : Tüm müÅteri hesaplarının pozitif bir bakiyeye sahip olması gerektiÄi olabilir. İÅlem, bir müÅteri bakiyesini negatif bakiyeye getirirse, bu iÅlem geri alınır. Bu Åekilde veri bütünlüÄünü korumada deÄiÅikliklerin baÅarılı olmasını veya tamamen iptal edilmesini saÄlar. ## Isolation (İzolasyon) Bir transactionâın tüm iÅlemleri tamamlanana kadar diÄer transactionlar tarafından yapılan deÄiÅiklikler ilgili transaction tarafından görülmez. Her transaction birbirinden baÄımsız çalıÅır. İÅlem sırasında birbirlerine müdahale etmezler. Veya dıÅarıdan bir müdahaleyi kabul etmezler. Bu izolasyonu ifade eder. Yukarıdaki tanımı biraz açıklayalım : İzole edilmiÅ iÅlemler(transaction) serileÅtirilebilir olarak kabul edilebilir. Her iÅlem, ardıÅık olarak gerçekleÅen herhangi bir iÅlem (transaction) olmaksızın farklı bir sırada gerçekleÅir. Veri tabanında gerçekleÅtirilen okuma veya yazma iÅlemi, aynı veri tabanında gerçekleÅen ayrı iÅlemlerin diÄer okuma ve yazmalarından etkilenmeyecektir. İÅlemlerin bir diÄeri baÅlamadan önce bütünü ile tamamlanmasını saÄlamak için sıraya giren her iÅlem ile birlikte genel bir durum oluÅturulur. İki iÅlemin yapılamayacaÄı anlamına gelmez bu durum. Yani iÅlemlerin aynı anda gerçekleÅen diÄer iÅlemleri etkileme olasılıÄı olmadıÄı sürece birden fazla iÅlem gerçekleÅebilir. Birçok iÅlemi (transaction) baÅlatmadan önce beklemeye zorlayabileceÄinden transactionların hızı etkilenebilir. Bu durum isolation saÄladıÄı ek veri güvenliÄine deÄer. İzolasyon, optimistic transactions ve pessimistic transactions olarak adlandırılan transactions arasında gidip gelen bir izin verilebilirlik ölçeÄinin kullanılması ile yapılabilir. **Optimistic Transaction** aynı yere iki kez okunmadan veya yazmadan tamamlanacaÄını varsayar. Yani bir iÅlemin aynı yere iki kez gelmesi durumunda her iki iÅlemde iptal edilir ve yeniden denenir. **Pessimistic Transaction** transactions diÄerlerini etkileyeceÄi varsayımıyla kaynakları kilitler. ## Durability (SaÄlamlık) Bir transaction içinde hata oluÅursa geri dönme yeteneÄine sahip olmalıdır. Hata oluÅursa bir önceki ilk noktaya dönülebilmelidir. EÄer transaction baÅarılı bir Åekilde biterse bu durum loglanmalıdır ve baÅarılı olduÄuna dair mesaj verilmelidir. Aslında SaÄlamlık, veri tabanında yapılan deÄiÅikliklerin, sistem hataları oluÅsa bile kalıcı olarak ayakta kalması saÄlanır. Bu durum veri tabanındaki verilerin hizmet kesintilerinde, çökme durumlarında ve baÅka durumlarda bozulmamasını saÄlar. Sonuç olarak ACID yaklaÅımının her durumu baÅarılı olduÄunda veri tabanları kuruluÅa deÄer saÄlamaya devam edebilmelerini saÄlamak için en üst düzey veri bütünlüÄü ve güvenliÄi ile korunur. Bozuk veri tabanlarına sahip veri tabanı, kullanıcılarına günlük iÅlemlerinde ve analizlerinde maliyet konusunda sorunlar yaratabilir. İliÅkisel veri tabanı yönetim sistemlerinde veriyi sorgulamak için özel bir programlama dili kullanılır. Dünyada neredeyse standart halini almıŠbu dil SQLâdir. (Structural Query Language) (Yapısal Sorgulama Dili) SQL içinde iÅlevlerine göre farklı komutlar yer almaktadır. Bu komutlar mantıksal bir Åekilde aÅaÄıdaki gibi sınıflandırılmıÅtır. ## 1- DDL (Data Definition Language â Veri Tanımlama Dili) Veri tabanı veya tablolarda yapısal deÄiÅiklikler yapabilmek için var olan SQL komutlarıdır. Bu komutlar ile yeni bir veri tabanı oluÅturmak, yeni bir tablo oluÅturmak veya var olan tablodan sütun eklemek-silmek veya tüm bunları silebilmek gibi iÅlemler yapılabilir. CREATE, ALTER, DROP, TRUNCATE, COMMENT, RENAME gibi komutlar bu iÅlemleri yapabilir. Create -> Bir veri tabanı veya veri tabanı içinde tablo oluÅturmayı saÄlar. Create Indez -> Index oluÅturmak için, tablonun sütun adı üzerinde index oluÅturur. Create View -> Görüntü oluÅturmak için kullanılır. Ãrnek kullanımı : ```SQL -- Database oluÅturmak Create database veritabanı_adi -- Veritabanı oluÅturduktan sonra tablo oluÅrutulabilir. Create table tablo_adi{ sütun_adi1 veri_türü, sütun_adi2 veri_türü, ... } ``` Alter -> Alter table ile kullanılabilir, bir tabloya sütun eklemek, mevcut sütunları silmek veya deÄiÅtirerek tablonun yapısını deÄiÅtirmek için kullanılır. Ãrnek kullanımı : ```SQL -- Tabloya sütun eklemek için: ALTER TABLE tablo_adı ADD sütun_adı veri_türü -- Tablodaki sütunu silmek için: ALTER TABLE tablo_adı DROP sütun_adı -- Tablodaki sütunun veri türünü deÄiÅtirmek için: ALTER TABLE tablo_adı ALTER COLUMN sütun_adı veri_türü (SQL Server, MS Access) ALTER TABLE tablo_adı MODIFY COLUMN sütun_adı veri_türü (MySQL, Oracle) ``` Drop -> veri tabanı, tablo ve indekslerin silinmesi için kullanılır. Drop View -> Görüntüyü siler. Ãrnek kullanımı : ```Sql -- Drop database komutu bir veritabanını silmek için kullanılır. Drop database veritabanı_adi -- Drop table komutu bir tabloyu silmek için kullanılır. Drop table tablo_adi -- Drop index komutu bir tablo indexini silmek için kullanılabilir. ALTER TABLE tablo_adı DROP INDEX indeks_adı (MySQL) DROP INDEX indeks_adı (DB2/Oracle) DROP INDEX tablo_adı.indeks_adı (MSSQL) ``` Truncate -> Truncate table ile tablodaki veri içeriklerini siler fakat tablo yapısı kalır. Comment -> **Sql de yorum satırı** sql ifadesinin ne amaçla kullanıldıÄını açıklamak için not almaya ve ya sql ifadesinin yürütülmesini durdurmak için kullanılır. Sql de çok satırı yorum satırı yapmak için aÅaÄıdaki yöntem kullanılır. Bu yöntemi sorgu içerisinde bazı alanları by-pass etmek içinde kullanabiliriz. ```sql --Ãrnek Yorum Satırı SELECT * FROM tablo_adi; /*Ãok Satırda Yorum Satırı Kullanımı*/ SELECT * FROM tablo_adi; ``` Rename -> Alanların isimlerini deÄiÅtirmek için kullanılır. ## 2- DML (Data Manipulation Language â Veri İÅleme Dili) Tablolardaki veriler üzerinde kayıt ekleme, silme, deÄiÅtirme ve sorgulama yapabilmeyi saÄlayan SQL komutlarıdır. SELECT, INSERT, UPDATE, DELETE Select sorgusu, DQL (Data Query Language- Veri Sorgulama Dili) olarak ayrılabilir. Select -> Veri tabanında yer alan mevcut kayıtların bir kısmını veya tamamını tanımlanan koÅullara baÄlı olarak alır. Yani bir veri tabanında yer alan bir veya daha fazla tablodan istenen satır deÄerlerini almak için kullanılır. Select komutu ile elde edilen veriler yine bir tabloya aktarılarak üzerinde iÅlemler yapılabilir. Ãrnek kullanımı: ```sql Select sütun_adi1,sütun_adi2, ... From tablo_adi Select * From tablo_adi ``` Insert -> komutu DML komutuydu. Insert into komutu ile veri tabanında yer alan tablolara yeni kayıt eklemek için kullanılır. Yani eklenen her bir kayıt tabloya yeni satır ekler. Insert into komutu, hem sütun adı hem de eklenecek verileri içerecek Åekilde veya sadece eklenecek deÄerleri tanımlayarak kullanılabilir. Ãrnek kullanımı : ```SQL -- Sütun adı ve veri tanımlayarak Insert into tablo_adi(sütun_adi1,sütun_adi2,...) Values(deger1,deger2,...) -- Sadece veri tanımlayarak Insert into tablo_adi Values(deger1,deger2,..) ``` Update -> komutu bir veri tabanındaki tablolarda yer alan kayıtlarda deÄiÅiklik yapmak ve güncellemek için kullanılır. Ãrnek kullanımı : ```SQL Update tablo_adi Set sütun_adi1=deger1,sütun_adi2=deger2,... Where sütun_adi=deger ``` ! NOT : Where yapısı kullanılmadıÄında tüm kayıtlar, kullanıldıÄında ise sadece koÅulu karÅılayan kayıtlar güncellenir. Delete -> Veri tabanında yer alan kayıtları silmek için kullanılır. Ãrnek kullanımı : ```SQL Delete from tablo_adi Where sütun_adi=deger ``` ! NOT : Where yapısı kullanılmadıÄında tüm kayıtlar, kullanıldıÄında ise sadece koÅulu karÅılayan kayıtlar silinir. ## 3- DCL (Data Control Language â Veri Kontrol Dili) Veri tabanı veya tablolar üzerinde yetkilendirmeler yapabileceÄimiz SQL komutlarıdır. GRANT, REVOKE, ALTER DEFAULT PRIVILEGES Grant -> Veritabanı kullanıcısına, veri tabanı rolüne veya uygulama rolüne izinler vermek için kullanılan komuttur. Deny -> Kullanıcıların haklarını kısıtlayan komuttur. Revoke -> Daha önce yapılan tüm kısıtlama ve izinleri iptal eden komuttur. Ãrnek Kullanım : ```sql REVOKE INSERT ON *.* FROM 'jeffrey'@'localhost'; REVOKE 'role1', 'role2' FROM 'user1'@'localhost', 'user2'@'localhost'; REVOKE SELECT ON world.* FROM 'role3'; GRANT ALL ON db1.* TO 'jeffrey'@'localhost'; GRANT 'role1', 'role2' TO 'user1'@'localhost', 'user2'@'localhost'; GRANT SELECT ON world.* TO 'role3'; ``` ## 4- TCL (Transaction Control Language â İÅlem Kontrol Dili) Tabloların içindeki verileri deÄiÅtirmek için kullandıÄımız DELETE, UPDATE, INSERT gibi DML komutlarımız vardı. Bu komutlarla bir transaction içinde ardıÅıl Åekilde deÄiÅiklikler yapabiliriz. İÅte bu deÄiÅiklikleri yönetebilmek için kullanılan SQL komutlarıdır. Bir transaction baÅarılı ise DML komutlarının meydana getirdiÄi deÄiÅiklikler COMMIT komutuyla kalıcı olarak tablolara yansıtılır. Ãzetle veri kalıcı olarak deÄiÅir. EÄer, bir sorun varsa ROLLBACK komutu ile o ana kadar oluÅan tüm deÄiÅimler geri alınır. COMMIT, ROLLBACK, SAVEPOINT Commit -> Yapılan deÄiÅiklikleri kalıcı hale getirilir. İŠartık tamamlanmıÅtır. Rollback -> Son commit e kadar olan yeri geri alır. Savepoint -> Daha sonra geri dönülecek bir dönüŠnoktası belirler. > **KAYNAKÃA** > > - [ACID-Wikipedia](https://en.wikipedia.org/wiki/ACID) > > - [ACID Nedir?-Medium](https://medium.com/cloud-and-servers/acid-nedir-53f729f2bbb2) > > - [ACID](https://www.yusufsezer.com.tr/veritabani-acid/) > > - [ACID-Database.Guide](https://database.guide/what-is-acid-in-databases/#:~:text=In%20database%20systems%2C%20ACID%20(Atomicity,occur%20while%20processing%20a%20transaction.)) > > - [ACID-bmcblogs](https://www.bmc.com/blogs/acid-atomic-consistent-isolated-durable/) > > - [Sql Komutları](https://www.bilgigunlugum.net/dbase/sql/sql_drop) > > - [DML-DDL-DCL](https://medium.com/@seda.kardz/dml-ddl-dcl-komutlar%C4%B1-cc500da62757) > > - [DML-DCL-DDL-TCL Komutlar](https://tuncayuyar.wordpress.com/2014/05/21/ddl-dml-dcl-ve-tcl-komutlari-arasindaki-fark-nedir/) > > - [Sql komutları-Geeksforgeeks](https://www.geeksforgeeks.org/sql-ddl-dml-tcl-dcl/) > > - [Sql Command-w3schools](https://www.w3schools.com/sql/sql_syntax.asp) > >