7 Kasım 2014 Cuma

SQL'de Transaction Oluşturma ve Kullanımı

Transaction  Nedir?
Transaction için SQL Server ortamında kullandığımız iş birimidir diyebiliriz. Çoğu zaman bir transaction yalnızca bir türde işlem yapar, yani sadece veri silme, veri güncelleme veya veri ekleme gibi tek türde işlem yapar. Ama bir transaction içinde birden fazla da işlem yapılabilir. Yine transaction içinde SELECT işlemleri de yapılabilmektedir. Transaction, çalışma yapısı olarak ya bütün işlemleri gerçekleştirir ya da hiçbirini gerçekleştirmez. İşlemlerden biri başarısız olursa, hiçbir işlem gerçekleşmez; ancak tüm işlemler başarılı olduğunda  Transaction, içinde gerçekleşen tüm veri değişikliklerini onaylamış demektir.  

Transaction bloğundaki işlemlerin hepsi başarılı olduğunda Transaction Commit (Onaylama) komutu çalışır ve değişiklikler veritabanında gerçekleşmiş olur. ancak bir hata varsa işleyiş bozulur ve Transaction Rollback (Geridönüş) komutu çalışır, bu şekilde tüm işlemler geri alınır ve en başa dönülür. Böylece veri kaybına karşı bir çeşit koruma mekanizması oluşturulmuş olunur.

Transaction  Nerde ve Ne Zaman Kullanırız
Örneğin veri tabanımızdan silinen kayıtları, başka bir veri tabanına yedekliyorsak. Bir silinme ve bir kaydetme işlemi söz konusu. Bu işlemlerin sırayla gerçekleşmesi gerekiyor. Silinme işlemi başarılı bir şekilde tamamlandı. Fakat kaydetme işleminde bir hata meydana geldi. Bu hata yetersiz hafızadan kaynaklanabilir, sistem işlem sırasında yeniden başlatılmıştır veya fiziksel bir arıza nedeniyle kapanmıştır. Bu nedenler yüzünden silinmiş kaydımıza elveda demek yerine, böylesi sorunlarla karşılaşma ihtimalimize karşı önlemimizi almamız gerekir. Çalışmasını istediğimiz kod bloğunu "transaction" bloklarına alırız ve sorun çözülmüş olur.

Şimdi örnekle konuyu pekiştirelim.

Örnek: Bir banka sisteminde para havale etme işlemi için örnek bir transaction tasarlayalım. Öncelikle aşağıdaki gibi bir "HESAP" tablosu oluşturalım ve tablomuzda müşterilere ait HESAP_ID, AD, SOYAD, HESAP_NO, BAKIYE bilgilerini tutalım. 
CREATE DATABASE BANKA
USE BANKA

CREATE TABLE HESAP
(
HESAP_ID INT PRIMARY KEY IDENTITY (1,1) NOT NULL,
AD       VARCHAR(30) NOT NULL,
SOYAD    VARCHAR(30) NOT NULL,
HESAP_NO INT         NOT NULL,
BAKIYE   INT         NOT NULL
)

Oluşturmuş olduğumuz "HESAP" tablomuza örnek kayıtlar girelim.
INSERT INTO HESAP VALUES('İBRAHİM','BAYRAKTAR',19265,7000)
INSERT INTO HESAP VALUES('SAMET','ULUTURK',19572,10000)
INSERT INTO HESAP VALUES('RAMAZAN','PINARBAŞI',19752,9500)
INSERT INTO HESAP VALUES('RAŞİT','BAKIR',19912,17000)

"Samet ULUTURK'ün hesabından, İbrahim BAYRAKTAR'ın hesabına 1000 TL havale yapılsın." Bu işlem için izleyeceğimiz algoritma Samet ULUTURK'ün bakiye bilgisini 1000 azaltmak ve İbrahim BAYRAKTAR'ın bakiye bilgisini 1000 artırmak olacaktır.
UPDATE HESAP SET BAKIYE = BAKIYE - 1000 --1.Sorgu
WHERE AD='SAMET' AND SOYAD='ULUTURK'

UPDATE HESAP SET BAKIYE = BAKIYE + 1000 --2.Sorgu
WHERE AD='İBRAHİM' AND SOYAD='BAYRAKTAR'
Havale işleminin gerçekleşmesi için bu iki sorgunun aynı anda gerçekleşmesi gerekir ve sistem kullanıcısı bu iki sorguyu birden çalıştırıyor. Şimdide örnek işlemimizde oluşabilecek olası hata senaryolarını inceleyelim.

Hata Olasılığı 1: Birinci SQL sorgumuzun çalışması fakat ikinci SQL sorgumuzda hata oluşması. Bu durumda Samet ULUTURK'ün hesabından 1000 TL eksilme olacak fakat İbrahim BAYRAKTAR'ın hesabında herhangi bir değişiklik olmayacaktır.

Hata Olasılığı 2: Birinci SQL sorgumuzda hata oluştu ve ikinci SQL sorgumuzun çalışması durumunda Samet ULUTURK'ün hesabından herhangi bir eksilme olmayacak fakat İbrahim BAYRAKTAR'ın hesabına 1000 TL eklenecek.

Örneğimizdeki gibi problemlerin ve olası hatalardan oluşacak karmaşanın önüne geçmek için  "transaction" yapısını kullanmalıyız. "transaction" sayesinde her iki sorguda birden çalıştıralacak, iki sorguda başarılı ise "transaction" onaylanacak fakat herhangi bir hata durumunda he iki sorguda iptal edilecek.

"transaction" yapısını SQL kodlarında kullanırken COMMIT ve ROLLBACK komutları kullanılır.

COMMIT komutu ile çalıştırılan tüm SQL komutlarının başarılı olması halinde işlemler veri tabanına yansıtılır. ROLLBACK komutu ise herhangi bir hata oluşumunda tüm işlemleri geri alır. 

Transaction  Oluşturalım
BEGIN TRANSACTION
BEGIN TRY

UPDATE HESAP SET BAKIYE = BAKIYE - 1000
WHERE AD='SAMET' AND SOYAD='ULUTURK'

UPDATE HESAP SET BAKIYE = BAKIYE + 1000
WHERE AD='İBRAHİM' AND SOYAD='BAYRAKTAR'

COMMIT
END TRY
BEGIN CATCH
ROLLBACK
END CATCH

"BEGIN TRANSACTION" ile "transaction" işlemini başlatıyoruz. Tek bir komut gibi çalışmasını istediğimiz SQL kodlarımızı yazdıktan sonra  "transaction" işlemini "COMMIT" ile sonlandırıyoruz. "COMMIT"  komutuna gelene kadar işlemde hata olsa da olmasa da, işlem sonuçları tablomuza yansımayacaktır. "END TRY" ile blogumuzu kapatıyoruz. İşlemde bir hata ile karşılaşılması durumunda "BEGIN CATCH" blogu devreye girecek ve "ROLLBACK" komutu ile yapılan işlemler geri alınacak.

Java Dizi Örnek

Klavyeden girilen N elemanlı bir dizinin;
  • Dizi elemanları toplamı
  • Dizi elemanları ortalaması
  • Dizi elemanları arasındaki maksimum değerin bulunması
  • Dizi elemanları arasındaki minimum değerin bulunması
  • Dizi elemanlarının küçükten büyüğe sıralanması
  • Bubble Sort (Kabarcık Sıralama) Algoritması
package DIZILER;
import java.util.Scanner;
public class DIZIORNEK {

public static void main(String[] args) {
  
int n, toplam, max, min;
min=max=toplam=0;
Scanner oku = new Scanner(System.in);
System.out.println("ELEMAN SAYISINI GIRINIZ:");

n=oku.nextInt();
int dizi[]=new int[n];
for(int i=0;i<dizi.length;i++) //Dizi elemanları toplamı
 {
    System.out.println((i+1)+"....SAYISINI GIRINIZ:");
    dizi[i]=oku.nextInt();
    toplam+=dizi[i];
 }
    int ort=toplam/n; //Dizi elemanları ortalaması
    for (int s=0;s<dizi.length;s++) //Dizi elemanları arasındaki maksimum değerin bulunması
 {
    if(dizi[s]>max)
   {
      max=dizi[s];
          }
 }
    min=dizi[0]; //Dizi elemanları arasındaki minimum değerin bulunması
    for(int a=0;a<dizi.length;a++) 
 {
         if(min>dizi[a])
    {
  min=dizi[a]; //Dizi elemanlarını küçükten büyüğe sıralanması
    }
 }
    int tut=0;//Bubble Sort - Kabarcık Sıralama Algoritması 
    for(int k=0;k<dizi.length-1;k++)
 {
  for(int y=0;y<dizi.length-1;y++)
         {
  if (dizi[y]>dizi[y+1])
     {
  tut=dizi[y];
  dizi[y]=dizi[y+1];
  dizi[y+1]=tut;
     }
  }
 }
 
System.out.println("DIZI ELEMANLARININ TOPLAMI="+toplam);
System.out.println("DIZI ELEMANLARININ ORTALAMASI="+ort);
System.out.println("DIZI ELEMANLARININ MAXIMUM DEGER="+max);
System.out.println("DIZI ELEMANLARININ MINIMUM DEGER="+min);

for(int b=0;b<dizi.length;b++)
{
 System.out.println((b+1)+"ELEMANIN DEGERI"+dizi[b]);
}

}}

5 Kasım 2014 Çarşamba

Bat Dosyası ile Bir Klasörü Otomatik Sıkıştırmak

Aşağıda verdiğim komutları bat dosyası haline getirin ve ilgili alanları düzenleyin.

C:\PROGRA~1\WinRAR\WinRAR.exe a -r -M1 -MD4096 -ibck -Y -O+ -ac -ep1 -ag+YYYYMMDD-HHMI "C:\AlinanYedek.rar" "C:\alinacak_klasor "
close

AlInacak Klasör: Hangi klasörü yedekliyorsanız onu yazın. Mavi ile işaretlediğim alan yedeğin nerede tutulacağı ve ilgili parametreleri düzenleyebilirsiniz. Tüm parametreler aşağıda. Daha sonra bu bat dosyasını Görev zamanlayıcıdan "Temel Görev Oluştur" kullanarak otomatik çalıştırabilirsiniz.

Commands:
a add files to an archive
c add an archive comment
d delete files from an archive
e extract files from an archive, ignoring paths
f freshen files within an archive
i find string in archives
k lock an archive
m move files and folders to an archive
r repair a damaged archive
rc reconstruct missing volumes
rn rename archived files
rr[N] add data recovery record
rv[N] create recovery volumes
s[name] convert an archive to a self-extracting type
s- remove SFX module
t test archive files
u update files within an archive
x extract files from an archive with full paths

3 Kasım 2014 Pazartesi

WampServer Üzerinde Phpmyadmin "root" Parolasını Değiştirmek

WampServer'ın kurulu olduğu dizinden \wamp\apps\phpmyadmin\config.inc.php yolunu izleyerek config.inc.php dosyamızı editörümüzle açıyoruz;


parolamızı değiştirdikten sonra dosyamızı kaydedip kapatıyoruz. Ardından WampServer üzerinden Restart All Services tüm servisleri yeniden başlatıyoruz.

2 Kasım 2014 Pazar

SQL'de Türkçe Karakter Sorunu Nasıl Çözülür?

Eğer bir database tanımlaması düzgün yapılandırılmadıysa yeni oluşturduğunuz veya taşıdığınız veritabanındaki içeriklerde bulunan türkçe karakterler bozulabilir. Bunun nedeni veritabanını oluştururken seçmemiş olduğunuz veya default kalan "collation" ayarıdır. Eğer default değeriniz türkçe değilse tanımlama bozuk olacaktır. 

Bu sorunu düzeltmek için ne yapabiliriz?

Yeni bir veritabanı oluştururken ya da veritabanı taşırken yeni ekranında sol tarafta bulunan "Options" sekmesinde açılan "collation" öğesini "TURKISH_CI_AS" olarak seçmelisiniz.


"collation" değerini "TURKISH_CI_AS" olarak değiştirirseniz tanımlama anlamında herhangi bir karakter sorunu yaşanmayacaktır.

Varolan bir veritabanının tanımlama dilini kontrol etmek isterseniz. Object Explorer üzerinde kontrol etmek istediğiniz veritabanına sağ tıklayın. "Properties" seçin. Açılan "General" sekmesinde sağ tarafta altta Maintenance başlığında "Collation" kısmı bulunmaktadır. 

Copyright 2013-2017 | İbrahim BAYRAKTAR /dev/null Web Günlüğü