Mysql Transaction İçersinde Insert Update Durumlarının Kontrol Edilmesi

94 views
Skip to first unread message

efe yilmaz

unread,
Jul 31, 2015, 11:49:13 AM7/31/15
to istanbul-coders
Merhabalar, 

Transaction içersinde insert ve update edilen sql sorgularının sonucuna hiç bakmıyorum. 

Yani arka arkaya 5 tane insert var. Bunlardan bir tanesi başarısız olması halinde, commit demişsem geçerli olur mu? Yada rollback mi yapar?

Yoksa sorgudan sonra insert yapılmış mı tek tek bakmam mı gerekir?

Kolay gelsin.

roy simkes

unread,
Aug 7, 2015, 7:30:42 AM8/7/15
to istanbul-coders
Transactionlar ile ne yapmaya calistigini tam anlamadim. INSERT isleminin olumsuz oldugu durumda, zaten mysql kutuphanesi hata verecektir. Ayni durum update icinde gecerli. 

Bir hata olmasi durumunda rollback yapmak sana kalmis bir durum. Misal bazi unique bir eleman var mi diye kontrol edip sonra insert etmek yerine, direkt insert etmeye calisip hata almak daha hizli bir cozum olabilir bazen. Eger bir procedure calistirmiyorsan, keza onlarin icinde hata olmasi durumunda case leri handle eden bolumler oluyor, orada da rollback kismini kendin yazman gerekir diye tahmin ediyorum. Transaction in amaci bu hata durumlarini handle etmek degil, 5. insert de hata oldugunda, diger 4 insert i bulup silme komutu yazmak zorunda kalma, rollback calistir ve basladigin noktaya geri don icin kullanilir.

Soruna cevap oldu mu?

roy

Loris Medici

unread,
Aug 7, 2015, 7:50:19 AM8/7/15
to istanbu...@googlegroups.com
Merhaba,

MySQL'de INSERT yapmaya çalışıp hata aldığında (MySQL'deki tam hatayı bilmiyorum, ORACLE'daki karşılık hata DUP_VAL_ON_INDEX'tir...) update yapmanın exception handling haricinde pratik bir yöntemi aşağıdaki gibi oluyor (büyük ihtimalle Roy'un bahsettiği çözüm de tam olarak bu):
http://dev.mysql.com/doc/refman/5.6/en/insert-on-duplicate.html

MySQL'in UPDATE komutunun dokümantasyonunda da şöyle bir ibare var:
"...
UPDATE returns the number of rows that were actually changed.
..."

Ayrıca MySQL'de (ORACLE'daki SQL%ROWCOUNT'takine benzer şekilde) aşağıdaki gibi bir bilgi fonksiyonu var:
http://dev.mysql.com/doc/refman/5.6/en/information-functions.html#function_row-count

Her DML komutundan sonra çalıştırıp etkilenen (eklenen, güncellenen, silinen) kayıt sayısını kontrol edebilirsiniz.

Kolay gelsin,
Loris.



7 Ağustos 2015 14:30 tarihinde roy simkes <roys...@gmail.com> yazdı:

--
* Mesaj alim frekansinizi grup uyelik ayarlarinizdan degistirebilirsiniz.
* Is arama veya ilan verme ile ilgili mailler icin konu kismina [IS_ILANI] tag'i eklemeniz gerekmektedir.
* Mesajlasmalarda her turlu hakaret ve satasma *uyari olmaksizin* uyeligin bitirilmesiyle son bulur.
* slack grubumuz: https://istanbulcoders.slack.com/ davetiye icin: http://goo.gl/forms/qc6Z78wpsL
* Is ilanlarinda grubu Ek Alici (cc) kismina koyun ki cevap donenler tum gruba donmesinler.
* Kisilere cevap yazacaginiz zaman, lutfen ilgili kisiyi alici (to) kismina koyun.
---
You received this message because you are subscribed to the Google Groups "istanbul-coders" group.
To unsubscribe from this group and stop receiving emails from it, send an email to istanbul-code...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Şaban Akkaya

unread,
Aug 7, 2015, 7:55:19 AM8/7/15
to istanbu...@googlegroups.com
Merhaba,

Eğer AUTOCOMMIT 1 olarak ayarlanmış sa her sorgudan sonra mysql
otomatik COMMIT işlemi yapacaktır. Yani sırasıyla yaptıgın 5 işlemin
ilk 4ünde hata yok ve sadece sonuncusunda hata varsa ilk 4 işlemi için
COMMIT gider son işlem için ROLLBACK gider. AUTOCOMMIT kurulumda
default olarak 1 gelmekte. Bunu "0" olarak ayarlarsan Bütün işlemler
için en son çalıştıracağın COMMIT veya ROLLBACK olayından etkilenir.
Yani yukarıdaki işlemi ele alırsak bütün sorguların için ROLLBACK
gidecektir.

7 Ağustos 2015 14:50 tarihinde Loris Medici <ma...@loris.medici.name> yazdı:

Loris Medici

unread,
Aug 7, 2015, 8:18:57 AM8/7/15
to istanbu...@googlegroups.com
Doğrudur, bu ayarın varsayılan değeri bana çok garip gelmişti ilk zamanlar. (Hiç alıştığımız bir zihniyet değil...) MySQL'i şimdiye kadar sadece Oracle'dan farkları / benzerlikleri nelermiş diye kurcalamak için kurdum / kullandım bunların hepsinde de AUTOCOMMIT OFF, ISOLATION_LEVEL READ_COMMITED ve BINARY LOGGING ROW LEVEL olacak şekilde ayarladım. (ORACLE'da alıştığımıza benzer şekilde...) Herhangi bir uygulamam için bir production ordamda kullanacak olsam da böyle ayarlardım...

MySQL'e bir dönem ilgi duydum ancak şu anda ORACLE'la girilemeyecek, girilmesi istenmeyen müşteriler için Postgre SQL çok çok daha ağır basıyor açıkçası. Server side Java ve (en güzeli) ORACLE'inki ile hemen hemen aynı bir procedural language kullanabilme olanakları (ve daha pek çok güzel özelliği) ile dikkat çekiyor.

P.S. 1997'den beri Oracle üzerinde hiç kesintisiz bilfiil çalışıyorum, bunlar (MySQL / Prosgre SQL) hep merak / inceleme...

Selamlar,
Loris.


7 Ağustos 2015 14:55 tarihinde Şaban Akkaya <sabana...@gmail.com> yazdı:

roy simkes

unread,
Aug 7, 2015, 8:34:18 AM8/7/15
to istanbul-coders
Bu arada dipnot, Autocommit degeri, transaction basladigini belirtmedigin durumlarda bakilan bir ayar. Yani sen eger, "START TRANSACTION [...]" seklinde baslarsan, o zaman autocommit degerinin bir anlami geliyor, senin ozellikle COMMIT ve ya ROLLBACK demen lazim ki islem tamamlansin, tamamlamadigi durumda ve session kapandiginda, ROLLBACK oluyor olmali.

roy

Loris Medici

unread,
Aug 7, 2015, 8:40:28 AM8/7/15
to istanbu...@googlegroups.com
Farkındayım teşekkürler. Oracle'dan alıştığımız şekilde çalışması için OFF olması gerekiyor. Aynı session'da ben ve/veya uygulamam COMMIT veya ROLLBACK diyene (veya DDL çalıştırana) kadar aynı implicit transaction içerisinde olmalıyım, tıpkı ORACLE'daki mantık.

Selamlar,


7 Ağustos 2015 15:34 tarihinde roy simkes <roys...@gmail.com> yazdı:

efe yilmaz

unread,
Aug 7, 2015, 11:14:47 AM8/7/15
to istanbu...@googlegroups.com
Merhaba, yorumlari için teşekkürler.

Bu dublicate içerik olur yada mysql kaynaklı farklı bir sorun olur. Sonuç itibariyle "kritik bir insert işlemi gerçekleşmediği durumda" commit ettiğim için o başarısız duruma bakmıyor anladığım kadarıyla. Sanırım farklı bir logicle 5 tane sorgunun durumuna if then else ye bağımlı kalmadan çözmek bu durumda.


7 Ağustos 2015 15:40 tarihinde Loris Medici <ma...@loris.medici.name> yazdı:

--
* Mesaj alim frekansinizi grup uyelik ayarlarinizdan degistirebilirsiniz.
* Is arama veya ilan verme ile ilgili mailler icin konu kismina [IS_ILANI] tag'i eklemeniz gerekmektedir.
* Mesajlasmalarda her turlu hakaret ve satasma *uyari olmaksizin* uyeligin bitirilmesiyle son bulur.
* slack grubumuz: https://istanbulcoders.slack.com/ davetiye icin: http://goo.gl/forms/qc6Z78wpsL
* Is ilanlarinda grubu Ek Alici (cc) kismina koyun ki cevap donenler tum gruba donmesinler.
* Kisilere cevap yazacaginiz zaman, lutfen ilgili kisiyi alici (to) kismina koyun.
---
You received this message because you are subscribed to the Google Groups "istanbul-coders" group.

Loris Medici

unread,
Aug 7, 2015, 11:46:07 AM8/7/15
to istanbu...@googlegroups.com

Herhangi bir sebeple Insert edemezsen mutlaka hata döner.

Autocommit ise zaten her statement yeni bir transaction, önceki 5 diye bir bütünlük yok.

Start transaction yapılırsa o zaman dönen hataya göre commit veya rollback yapmak sana kalmış; commit edersen start transaction'dan hata aldığın insert'e kadar yapılan işler bütünlüklü olarak commit eder, rollback ise bütünlüklü olarak başa döner.

roy simkes

unread,
Aug 8, 2015, 9:01:16 AM8/8/15
to istanbul-coders
Merhaba Efe,

Evet dedigin gibi, transaction bir insert calismasi gerektigi gibi calismadigi durumda commit etmeni engellemez, keza transaction in gorevi bu degildir. Transaction bir grup islemin, tabiri caizse "ya hep ya hic" olarak calistirilmasini saglar. Bir anlamda transaction her islemi gecici bir yerde yapar, sen commit dediginde, bunlari kalici olarak kaydedir, rollback yaptiginda, gecici islemlerin tamami yok eder.

roy
Reply all
Reply to author
Forward
0 new messages