Docker nedir

Merhaba arkadaşlar, bu yazımda oldukça sık duyduğumuz Docker teknolojisinden bahsetmek istiyorum.

Docker; konteynerlar kullanılarak uygulama oluşturmayı, dağıtmayı veya çalıştırmayı sağlayan bir araçtır. Konteynerlar uygulamamızın ihtiyaç duyduğu kütüphaneler ve diğer bağımlılıklar gibi tüm parçaların tek bir pakette birleştirilip, gönderilmesini sağlar. Böylece geliştirici; kodun yazıldığı ve test edildiği makineden bağımsız olarak uygulamanın Docker sayesinde tüm ortamlarda çalışacağından emin olur.

Aslında Docker’ı bir sanal makineye benzetebiliriz. Ancak sanal bir makineden farklı olarak tamamen sanal bir işletim sistemi oluşturmak yerine Docker uygulamaların üzerinde çalıştıkları sistemle aynı Linux çekirdeği kullanmalarına izin verir. Böylece önemli bir performans artışı görülür ve uygulamanın boyutu önemli bir ölçüde azalır.

Docker; hem geliştiricilere hem de sistem yöneticilerine fayda sağlamak üzere birçok DevOps araç zincirinin bir parçası haline gelmiş bir araçtır. Geliştiriciler için, sonunda çalışacağı sistemden endişe etmeden kod yazmaya odaklanabilecekleri anlamına gelir.

Docker hakkında yardımcı olabilecek kaynaklar :

Docker – Get Started
tutorialspoint – Docker

Bir dahaki yazımda görüşmek üzere.

 

 

Spring ve Spring Boot arasındaki farklar

Merhaba arkadaşlar, yazılarımıza kaldığımız yerden devam ediyoruz :). Bu yazımda Spring ile Spring Boot arasındaki temel farklılıklara değineceğim.

Geçtiğimiz birkaç yılda eklenen özellikler nedeniyle Spring kütüphanesi giderek daha karmaşık bir hal almaya başladı. Sıfırdan yeni bir Spring projesine başlamak için bir sürü prosedürden geçilmesi gibi durumlar olabiliyor. Sıfırdan başlamayı önlemek ve zamandan tasarruf etmek için Spring Boot diye bir teknoloji dünyamıza girdi. Spring Boot yine Spring kütüphanesini kullanan bir teknolojidir.

Spring Kütüphanesi

Spring; bir web uygulaması geliştirmek için en yaygın olarak kullanılan Java EE (Java Enterprise Edition) kütüphanelerinden biridir. Java platformu için ayrıntılı bir programlama ve yapılandırma modeli sunar. Java EE kapsamında uygulama geliştirmeyi basitleştirmeyi amaçlar ve biz geliştiricilerin daha üretken olmasına yardımcı olur.

Diğer kütüphanelerin aksine Spring uygulamanın birkaç alanına odaklanır ve kapsamda birçok özellik sunar.

Bilindiği üzere Spring kütüphanesinin en önemli özelliği Dependency Injection dır.  Dependency Injection hakkındaki yazım için tıklayınız.

Spring Boot

Spring kütüphanesi bize esneklik uygulamaya odaklanırken, Spring Boot kod uzunluğunu kısaltmayı ve bir web uygulaması geliştirmenin en kolay yolunu bize sunmayı amaçlamaktadır. Spring Boot, uygulama geliştirme için gerekli olan süreyi bir hayli kısaltır. Neredeyse hiçbir konfigürasyon yapmadan tek başına bir uygulama oluşturulmasına yardımcı olur.

Oto konfigürasyon Spring Boot için özel bir özelliktir.

Spring kütüphanesinin yararları

  • Spring kütüphanesi bir web uygulamasının tüm katmanlarına uygulanabilir.
  • Gevşek bağlılık (Loose Coupling) ve kolay test edilebilirlik sağlar.
  • XML ve  Annotation konfigürasyonlarını destekler.
  • Singleton ve Factory sınıflarının ortadan kaldırılması için gerekli yeteneğe sahiptir.
  • Bildirimsel (Declarative) programlamayı destekler.

Spring Boot’un yararları

  • Bağımsız (stand-alone) uygulamalar oluşturur.
  • Gömülü olarak Tomcat, Jetty veya Undertow birlikte gelir.
  • XML konfigürasyonuna ihtiyaç duymaz.
  • LOC (Lines of Code) ‘u azaltmayı hedefler.
  • Başlatması kolaydır.
  • Özelleştirme ve yönetim basittir.

Bu nedenle Spring Boot bir kütüphane olmayıp, Spring tabanlı hazır bir proje başlatıcıdır. Otomatik yapılandırma gibi özelliklerle sizi uzun kod yazmaktan kurtarır ve gereksiz yapılandırmalardan kurtulmanızı sağlar.

Hibernate ve Spring Data JPA arasındaki farklar

Merhaba arkadaşlar, bu yazımda Hibernate ve Spring Data JPA arasındaki temel farklılıklara değineceğim.

Konuya geçmeden önce  Hibernate, JPA ve Spring Data JPA kavramlarından bahsetmenin faydalı olacağını düşünüyorum.

JPA (Java Persistence API) nedir?

Java Persistence API herhangi bir java nesnesinin veri tabanındaki ilişkisel bir tabloya eklenebilmesini, o tablodan okunabilmesi gibi çeşitli özellikler sağlar.

Hibernate nedir?

Hibernate, Java ortamları için bir ORM (Object Relational Mapping) çözümüdür. ORM; model sınıflarımızın ilişkisel veri tabanındaki tablolarımızla eşleşebilmesini sağlayan bir programlama tekniğidir. Bir nevi uygulama ile ilişkisel bir veri tabanı arasında bir köprü olarak düşünülebilir. Hibernate, Java tabanlı bir ORM teknolojisidir.

Buraya kadar yazılanlardan yola çıkarak JPA (Java Persistence Api) ‘ın bir standart, Hibernate’in ise bir JPA uygulaması olduğunu aklımızdan çıkarmayalım.

Spring Data JPA nedir?

Spring Data; Spring kütüphanesinin bir parçasıdır.

Spring Data sanıldığı aksine Hibernate gibi bir JPA uygulaması değildir. Sadece JPA uygulamamızın en üst katmanına ekstra soyut bir katman ekleyen bir kütüphanedir.

Spring Data JPA GenericDao özel uygulamalarına bir çözüm sunar. Metot adı kuralları aracılığıyla sizin adınıza JPA sorguları oluşturabilir.

 

Buraya kadar olan kısmı toparlamak gerekirse Hibernate ile Spring Data JPA arasındaki temel farklılıklar şunlardır;

Hibernate bir JPA uygulaması iken Spring Data JPA bir veri erişimi soyutlamasıdır.

Spring Data ile Hibernate, Eclipse Link gibi herhangi bir JPA uygulamasını beraber kullanabilirsiniz. Dolayısıyla Hibernate ile Spring Data JPA bir rakip değillerdir ve aynı kapsamda değerlendirilemezler aksine birbirlerini tamamlayıcı özellikler taşırlar.

Bir dahaki yazımda görüşmek üzere, hoşçakalın…

 

 

Java Serialization nedir

Merhaba arkadaşlar. Bu yazımda Java Serialization (Serileştirme) konusuna değineceğim.

Bir klişe olacak ama Java bilindiği üzerine nesneye yönelik bir dil. Primitive tipler (int, char, boolean … gibi) hariç neredeyse herşey nesne ve bu nesneleri sürekli ve sürekli kullanırız. Ancak nesneleri bazen JVM dışında kullanmak gerekebiliyor. Fakat dışarıda kullandığımız bir nesnemizi tekrar içeride kullanmak istediğimizde nesne içinde kullanılan değerlerin hangi tipte olduğunu öğrenemiyoruz. Yani herhangi bir sınıftan bir nesne üretip, bunu bir dosyaya yazdırıp onu tekrar dosyadan okuğumuzda değerlerin tip bilgisini bilememe problemimiz var. İşte tam bu durumda Java Serialization API yardımımıza koşuyor.

Bu durumu basit bir örnekle anlatarak durumun daha iyi pekişeceğine inanıyorum.

Araba bilgilerini tutan Car diye bir sınıfımız olsun ve bu bilgileri bir dosyaya kaydedip, tekrar okuma işlemi yapalım.

Serileştirme işlemi için Serializable arayüzünü implement etmek gerekiyor.

Araba sınıfımız :

import java.io.Serializable;

public class Car implements Serializable {
    private String brand;
    private String model;

    Car(final String brand, final String model) {
        this.brand = brand;
        this.model = model;
    }

    public String getBrand() {
        return brand;
    }

    public void setBrand(final String brand) {
        this.brand = brand;
    }

    public String getModel() {
        return model;
    }

    public void setModel(final String model) {
        this.model = model;
    }
}

 

Nesnemizi dosyaya yazdırdığımız test sınıfımız :

import java.io.FileOutputStream;
import java.io.ObjectOutputStream;

public class Main {
    public static void main(final String[] args) {
        write();
    }
    private static void write(){
        try{
            final Car car = new Car("Seat", "Leon");
            final FileOutputStream file = new FileOutputStream("/Users/okan/Documents/car.txt");
            final ObjectOutputStream write = new ObjectOutputStream(file);
            write.writeObject(car);
            write.close();
        }
        catch(final Exception e){
            System.out.println(e.getMessage());
        }
    }
}

 

Nesnemizi dosyaya yazdığımız zaman dosyamızın çıktısı şu şekilde.

¨ÌsrCarÇ«5xÕçLbrandtLjava/lang/String;Lmodelq~xptSeattLeon

 

Şimdi gelin bu nesneyi dosyadan tekrar okuyalım.

import java.io.FileInputStream;
import java.io.ObjectInputStream;

public class Main {
    public static void main(final String[] args) {
        read();
    }

    private static void read() {
        try {
            final FileInputStream file = new FileInputStream("/Users/okan/Documents/car.txt");
            final ObjectInputStream read = new ObjectInputStream(file);
            final Car car = (Car) read.readObject();
            System.out.println(car.toString());
            read.close();
        }
        catch (final Exception e) {
            System.out.println(e.getMessage());
        }
    }

}

 

Çıktımız :

Marka : Seat
Model : Leon

 

Görüldüğü gibi dosyaya yazdırdığımız nesneyi tekrar okuyup, başarılı bir şekilde konsolumuza yazdırabildik.

Bir dahaki yazımda görüşmek üzere, hoşçakalın.

REST mimarisi ve RESTful servisleri nedir

Merhaba arkadaşlar, bu yazımda özellikle web uygulamalarımızda oldukça sık kullandığımız REST (Representational State Transfer) mimarisinden bahsetmek istiyorum.

REST mimamisi HTTP üzerinde çalışan bir yapıya sahiptir. Diğer mimarilere göre daha basit ve hızlı olduğunu söyleyebiliriz. Sunucu ve istemci arasında verileri JSON yada XML formatında taşıyarak uygulamaların birbirleriyle haberleşebilmelerini sağlar. REST mimarisi ile uyumlu olan servislere RESTful servisler denmektedir.

REST mimarisi stateless olup, herhangi bir durum bilgisi saklamaz. Dolayısıyla istemci-sunucu arasında taşınan verilerde istemciye ait herhangi bir veri bulunmaz.

REST mimarisini diğer bir popüler olan SOAP mimarisiyle karşılaştırırsak şunları rahatlıkla söyleyebiliriz.

  • SOAP servisleri RPC (Remote Process Call) yöntemini kullanır. Güvenlik protokollerini içinde barındırır, state bilgisini request ve response larda tutar. Fakat bu durum REST mimarisinde daha farklıdır. RESTful servislere direkt bir URL üzerinden erişilir. Arada herhangi bir güvenlik protokolü, bileşen vs… yoktur.
  • SOAP olan bir servisi kullanabilmeniz için servisin WSDL bilgisine ihtiyaç duyarsınız. Proxy sınıfları ve bileşenler gerekmektedir. Kısaca bir istemci SOAP ile ilgili neredeyse tüm detayları bilmek zorundadır. Aksi halde bu servisi istemcinin kullanması mümkün değildir. REST mimarisinde ise herhangi bir servisi çağırmak için sadece URL bilgisini bilmeniz yeterlidir. Kısaca bir istemcinin REST mimarisine ait bir servisin yapısını ve detaylarını bilmesine gerek yoktur. Son derece esnek bir yapıya sahiptir.

RESTful servisleri üzerinden CRUD (Create, Read, Update, Delete) işlemlerinin gerçekleştirilebilmesi için HTTP metotları kullanılır. Popüler olan HTTP metotları şunlardır;

  • GET (okuma işlemleri için)
  • POST (kayıt ekleme işlemleri için)
  • PUT (güncelleme işlemleri için)
  • DELETE (silme işlemleri için)

REST mimarisinin basit yapısı, kolay uygulanabilmesi, hızlı çalışması gibi olumlu özellikleri olsa da önemli bir dezavantajı vardır. Bunlardan biri güvenlikle ilgilidir. SOAP REST mimarisine göre güvenlik konusunda kendi standartları gereği daha avantajlıdır. Fakat REST mimarisinde güvenlik konusu işin geri kalan kısmıdır.

Bir dahaki yazımda görüşmek üzere, sevgiyle…

 

 

Java Optional Sınıfı

Merhaba arkadaşlar. Bu yazımda Java 8 ile birlikte hayatımıza giren en önemli özelliklerden biri olan Optional sınıfını anlatmak istiyorum.

Bu sınıf; null referanslar yerine isteğe bağlı değerleri göstermek için iyi bir çözüm sunmaktadır.

Optional sınıfı java.util paketine aittir.

import java.util.Optional;

Şimdi basitçe bir optional nesnesi nasıl oluşturulur ona bakalım.

Optional empty = Optional.empty();

Yukarıda gördüğünüz üzere basitçe Optional sınıfının empty() metodunu kullanarak boş bir Optional nesnesi oluşturmuş olduk.

Bir Optional nesnesi üzerinde herhangi bir değer olup, olmadığını nasıl kontrol ediyoruz ona bakalım.

empty.isPresent()

Yukarıdaki blokta olduğu gibi isPresent() metodunu kullanarak herhangi bir Optional nesnesi üzerinde bir değer olup, olmadığını kontrol edebiliriz. Sonuç olarak üzerinde henüz herhangi bir değer olmadığı için bize false dönecektir.

Ayrıca Optional tipinde olmayan bir nesneyi Optional tipine çevirebilmemiz mümkün.

String name = "The Coders";
Optional<String> var = Optional.of(name);

Fakat bazı durumlarda null olan nesnelere de bu işlemi uygulayabilmemiz gerekiyor. Bunun için Optional.ofNullable() metodunu kullanabiliriz. Aksi halde NullPointerException hatasıyla karşılaşabiliriz.

String name = null;
Optional<String> var = Optional.ofNullable(name);

Optional sınıfının en önemli özelliklerinden biri de ifPresent metodudur. Bu metod; Optional nesnesinin üzerinde herhangi bir değer tutulduğu zaman istenilen işlemlerin yapılmasına olanak sağlar.

String name = "The Coders";
Optional<String> var = Optional.ofNullable(name);
var.ifPresent(v -> System.out::println);

Bazen Optional nesnesi üzerinde herhangi bir değerin tutulup, tutulmadığının kontrolü yapılırken tutulmadığı durumdaki senaryoları tasarlayabilmemiz gerekiyor. Bunun için Optional sınıfının bize sunduğu çözümlere bakalım. Bunlar; orElse(), orElseGet(), orElseThrow()

orElse() kullanımı

Eğer Optional nesnesi üzerinde herhangi bir değer tanımlı değilse bu durumda istediğimiz değeri dönebiliriz.

String name = null;
Optional<String> optionalName = Optional.ofNullable(name);
String result = optionalName.orElse("The Coders");

orElseGet() kullanımı

orElseGet(); orElse() metoduna benzerdir. Eğer Optional nesnesi üzerinde herhangi bir değer tanımlı değilse bu durumda istediğimiz değeri orElse() deki gibi direk dönmek yerine functional interface kullanabiliriz.

String name = null;
Optional<String> optionalName = Optional.ofNullable(name);
String result = optionalName.orElseGet(() -> "The Coders");

orElseThrow() kullanımı

Eğer Optional nesnesi üzerinde herhangi bir değer tanımlı değilse bu durumda hata fırlatabiliriz.

String name = null; 
Optional<String> optionalName = Optional.ofNullable(name); 
String result = optionalName.orElseThrow(IllegalArgumentException::new);

Optional nesnesi içindeki değeri almak için kullanılan diğer bir yöntem ise get() metodudur.

Optional<String> optionalName = Optional.ofNullable("The Coders");
String name = optionalName.get();

Fakat bu yöntemin bir dezavantajı vardır. Eğer Optional nesnesi üzerinde herhangi bir değer yoksa ve direkt olarak get() metodunu kullanırsak NoSuchElementException() hatasını alırız.

Bir dahaki yazımda görüşmek üzere, hoşçakalın.

Dependency Injection Nedir

Merhaba arkadaşlar. Bu yazımda size DI (Dependency Injection) kavramından kısaca en basit haliyle bahsetmek istiyorum.

DI (Dependency Injection), IoC (Inversion of Control)’un en önemli implementasyonlarından biridir. Peki IoC (Inversion of Control) neydi, bunu bir hatırlayalım. IoC (Inversion of Control); uygulamamızda nesne oluşturma işinin geliştiriciden alınarak ilgili çatının sorumluluğuna devredilmisidir.

SOLID prensiplerindeki son harfi temsil etmektedir.

Uygulama katmanımızda bir A sınıfı olsun ve bu A sınıfımızın bir üyesi başka bir sınıf olan B sınıfına ait olsun. Bu ilişkiyi A sınıfımızın içinde new operatörü ile yaptığımızı düşünelim. Böylece A sınıfımız, B sınıfımızın özelliklerine ve davranışlarına daha ortada hiçbirşey yokken bağlı hale getirmiş olduk. Peki bu istenilen bir durum mu, tabiki hayır. İşte DI (Dependency Injection) kavramı burada devreye giriyor. Bu prensip sayesinde nesne atamalarını çatımızın sorumluluğuna bırakıyoruz ve bunu bizim yerimize sadece gerektiği durumlarda atamaları gerçekleştirerek dinamik hale getiriyor. Bunu başka bir cümleyle açıklamak gerekirse; uygulamamızın çalışırken o an kullanması gereken nesneler çatı tarafından enjekte edilecektir. Böylece sonraki süreçlerde herhangi bir düzenleme yada değişiklik olması durumunda sadece belirli kısımların değiştirilmesi yeterli olacaktır.

Şimdi bu prensibi artılarıyla ve eksileriyle beraber değenlendirelim.

Artıları

  • Uygulamamızı oluşturan yapılan birbirleri ile bağımlılıkları azaldığı için uygulamamızda değişiklik yapmak daha kolay hale gelmesi. (Bunu loosely coupled olarak da tanımlıyabiliriz.)
  •  Çok rahat bir şekilde Unit testler yazmamızı sağlayabilmesi. İstediğimiz sınıfı rahatlıkla mock edip, kolayca test edebilmemiz.

Eksileri

  • Oluşturduğumuz sınıf sayısının fazla olması
  • Gereksiz interface lerin fazlalığı

Bir sonraki yazımda görüşmek üzere, hoşçakalın.

Builder Design Pattern

Merhaba arkadaşlar. Bu yazımda oldukça popüler ve işlevi büyük olan bir tasarım deseninden bahsetmek istiyorum.

Bu tasarım desenimizin ismi Builder ve Creational grubuna ait. Yapı olarak Abstract Factory desenine benzerlikleri vardır.

Bazen projelerimizde nesnelerimize ait birçok özellik olabilir ve bu nesnelerimizi farklı özellik/parametre ler ile oluşturmak isteriz. Dolayısıyla bazen çalıştığımız sınıflar içerisinde çok fazla parametre alan metodlar ve yapılandırıcılar kullanabiliyoruz. Bu kullanılabilirliği ve okunabilirliği oldukça zorlaştıran bir durum. Bazen aynı methodu çok fazla kez overload edip, kendimize iş yükü doğurabiliyoruz. İşte bu kısımda yardımımıza builder design pattern yetişiyor.

Şimdi gelin, bu tasarım deseniyle alakalı basit bir örnek yapalım.

Nesne sınıfımız :

public class Computer {
    private String brand;
    private String price;
    private String cpu;
    private String ram;

    public Computer(final String brand, final String price, final String cpu, final String ram) {
        this.brand = brand;
        this.price = price;
        this.cpu = cpu;
        this.ram = ram;
    }

    public String getBrand() {
        return brand;
    }

    public void setBrand(final String brand) {
        this.brand = brand;
    }

    public String getPrice() {
        return price;
    }

    public void setPrice(final String price) {
        this.price = price;
    }

    public String getCpu() {
        return cpu;
    }

    public void setCpu(final String cpu) {
        this.cpu = cpu;
    }

    public String getRam() {
        return ram;
    }

    public void setRam(final String ram) {
        this.ram = ram;
    }

    @Override
    public String toString() {
        return "Computer{" +
                "brand=" + brand +
                ", cpu=" + cpu +
                ", ram=" + ram +
                ", price=" + price +
                '}';
    }
}

Builder sınıfımız :

public class ComputerBuilder {
    private String brand;
    private String price;
    private String cpu;
    private String ram;

    public ComputerBuilder setBrand(final String brand) {
        this.brand = brand;
        return this;
    }

    public ComputerBuilder setPrice(final String price) {
        this.price = price;
        return this;
    }

    public ComputerBuilder setCpu(final String cpu) {
        this.cpu = cpu;
        return this;
    }

    public ComputerBuilder setRam(final String ram) {
        this.ram = ram;
        return this;
    }

    public Computer buildComputer() {
        return new Computer(brand, price, cpu, ram);
    }
}

Test sınıfımız :

public class MainClass {
    public static void main(String[] args) {
        final ComputerBuilder computerBuilder = new ComputerBuilder();

        final Computer computer1 = computerBuilder
                .setBrand("ASUS")
                .setCpu("2,40 GHZ")
                .setPrice("1500 $")
                .setRam("8 GB")
                .buildComputer();

        System.out.println(computer1);

        final Computer computer2 = computerBuilder
                .setBrand("APPLE")
                .setCpu("2,60 GHZ")
                .setPrice("3500 $")
                .setRam("16 GB")
                .buildComputer();

        System.out.println(computer2);
    }
}

Bir sonraki yazımda görüşmek üzere, hoşçakalın 🙂

Java instanceof kullanımı

Merhaba arkadaşlar. Bu yazımda Java projelerimizde sık bir şekilde kullandığımız instanceof operatöründen bahsedeceğim.

Java instanceof operatörü herhangi bir nesnenin belirtilen türe ait olup, olmadığını öğrenmek için kullanılır. Bu operatör aynı zamanda tip karşılaştırmak için de kullanıdır ve Boolean tipinde true yada false değerini döner. Bu operatör null bir değişkene uygulandığında false değerini dönmekle yükümlüdür.

Şimdi basit bir örnek yapalım.

public class MainClass {
    public static void main(String[] args) {
        Car car = new Car();
        System.out.println(car instanceof Car);
    }
}
Output : true

Yukarıda kod bloğunda gördüğünüz üzere Car sınıfından bir nesne yarattık ve bu nesnenin Car sınıfına ait olup, olmadığını ekrana yazdırdık ve sonuç olarak bize true değerini döndürdü.

Alt sınıf nesnesinin türü de aynı zamanda bağlı olduğu üst sınıfının türüyle aynıdır. Yani Car sınıfımızın bir alt sınıfı olarak Opel sınıfı olsun. Opel sınıfından bir nesne yaratıp, bu nesnenin Car sınıfına ait olup olmadığını sorgularsak sonuç olarak bize true dönecektir.

Şimdi bunla ilgili bir örnek yapalım.

public class Opel extends Car {
}
public class MainClass {
    public static void main(String[] args) {
        Opel opel = new Opel();
        System.out.println(opel instanceof Car);
    }
}
Output : true

Yazının başında da bahsettiğim gibi instanceof operatörünü null bir değişkene uygularsak sonuç olarak bize false döner.

public class MainClass {
    public static void main(String[] args) {
        Opel opel = null;
        System.out.println(opel instanceof Opel);
    }
}
Output : false

Bir dahaki yazıda görüşmek üzere, hoşçakalın 🙂 ..

Isolation Level nedir

Merhaba arkadaşlar. Bu yazıda size kısaca çoğu kişinin merak ettiği veri tabanı sistemlerinde kullanılan izolasyon seviyelerinden bahsedeceğim.

Bildiğiniz üzere bir veri tabanında tutarlığı korumak için dört farklı özellik bulunmaktadır. Bunlar; atomicity, consistency, isolation ve durability (Kısaca ACID diye söylenebilir). Biz burada isolation (izolasyon) kısmıyla ilgileneceğiz. İzolasyon bir işlem bütünlüğünün diğer kullanıcı ve sistemlere nasıl göründüğünü ifade eder. İzolasyon seviyesi veri tabanındaki bir işlemin başka işlemlerden nasıl izole edilmesi gerektiğini tanımlar. Kullanılacak olan izolasyon seviyesi aşağıdaki olaylar düşünülerek ve kullanılacak sistemin ihtiyaçlarına göre belirlenebilir.

Dirty Read : Adından da anlaşılacağı gibi kirli bir okumadır. Bir işlemin henüz işlenmemiş bir veriyi okuduğu durumdur. Örnek olarak elimizde T1 ve T2 diye iki işlemimiz olsun. T1 herhangi bir satırı güncelliyor fakat değişikliği onaylamadan işini bırakıyor. Bu arada T2 bu güncellenmiş veriyi okuyabiliyor. Eğer T1 bu işlemi geri alırsa T2 var olmamış veriyi okumaya devam edecektir.

Non-Repeatable Read : Yine elimizde T1 ve T2 diye iki işlemimiz olduğunu varsayalım. Örneğin T1 in bir veriyi okuduğunu varsayalım. Eş zamanlı olarak T2 de bu veriyi güncellemiş olsun. Şimdi T1 aynı verileri tekrar alırsa farklı bir değer okumuş olur.

Şimdi izolasyon seviyelerinden bahsedelim. Bilindiği üzere temelde dört adet izolasyon seviyesi bulunmaktadır.

Read Uncommitted : Read Uncommitted en düşük izolasyon seviyesidir. Adından da anlaşılacağı gibi bu seviyede bir işlem başka bir işlemin henüz onaylamadığı değişiklikleri okuyabilir. Bu sayede yukarıda bahsettiğimiz Dirty Read olayına izin verilmiş olur.

Read Committed : Bu izolasyon seviyesi okunan herhangi bir verinin okunduğunda verinin önceden işlendiğini garanti eder. Böylece Dirty Read e izin vermez.

Repeatable Read : En kısıtlayıcı izolasyon seviyesidir. Bu seviyede herhangi bir işlem referans aldığı tüm satırlarda okuma kilitlerini tutar. Diğer işlemler bu satırları okuyamayacağından, güncelleyemediğinden veya silemediğinden, böylece Non-Repeatable Read ı önlemiş olur.

Serializable : Bu en yüksek izolasyon seviyesidir. Seri hale getirilebilir bir yürütmenin serileştirilmesi garanti edilir.

 

Bu izolasyonların seviyeleri için şu en iyisidir veya şu en kötüsüdür diye bir yorumda bulunamayız. Hangisinin bizim için iyi veya kötü olduğu var olan uygulamamızın ihtiyaçlarına göre değişebilir.

Bir dahaki yazıda görüşmek üzere, hoşçakalın 🙂