mysql rollback çalışmıyor

Web tabanlı uygulama geliştirme araçları(PHP, ASP vb...) ile ilgili konuları buraya yazabilirsiniz.
Cevapla
akdatilla
Üye
Mesajlar: 292
Kayıt: 02 Nis 2006 06:04
Konum: Antalya

mysql rollback çalışmıyor

Mesaj gönderen akdatilla »

Merhaba arkadaşlar,
PHP ile mysql veritabanında işlem yapan bir programım var. Programımda bazı noktalarda transaction kullanıyorum. Transaction başlat komutunu, ardından bir insert işlemi yapıyorum. Daha sonra bir hatayı görüp rollback komutunu veriyorum. Ancak rollback komutu yapılan insert işlemini geri almıyor. Tablo InnoDB, php de kullandığım mysql kütüphanesi "mysqli". Lütfen yardımcı olur musunuz?
Program daha önce informix veritabanında çalışıyordu, mysqle geçince bu problemle karşılaştım.
Kullanıcı avatarı
Battosai
Üye
Mesajlar: 1316
Kayıt: 01 Eki 2007 12:02
Konum: Ankara

Re: mysql rollback çalışmıyor

Mesaj gönderen Battosai »

Bu yazdıklarınızdan nasıl bir cevap üretelim. Basit bir örneği linkte var. try catch içinde kullanın rollback kodunu catch içine yazın...

http://www.w3schools.com/php/func_mysqli_rollback.asp
akdatilla
Üye
Mesajlar: 292
Kayıt: 02 Nis 2006 06:04
Konum: Antalya

Re: mysql rollback çalışmıyor

Mesaj gönderen akdatilla »

Program içerisinde transaction başlatma, query çalıştırma, commit ve rollback çağırımları farklı fonksiyonlarla çağrıldığı için tek parça bir kod bloğu çalışmıyor. Basit bir örneği test ettim ve işlemin başarılı olduğunu gördüm. Yazdığım program içerisinde bir yerlerde uyumsuzluk sorunu var yada başka bir hata var. Sonuç olarak mysql yada php ile ilgili bir sorun değil, şu an başka bir projeye bakmam gerektiği için bu konuyu da ertelemem gerekti. İlgine teşekkür ederim, sağol.

Kod: Tümünü seç

<?php
		include ("../yonet/databaglan.php");
		uyegiriskontrol();
		
		
function sbcikfatfisyukle($fatno,$fattar)
{
	global $acfisno;
	global $fisfattrhler;
	global $fisfatnolar;
	global $rafharekettbl;
	global $ozelfistbl;

	$sipsart1=' AND sbcikmas.fatno="'.$fatno.'" and sbcikmas.fattar="'.mydbtarihcevir($fattar).'"';
	$sipsart2=' AND pkt_fatno="'.$fatno.'" and pkt_fattar="'.mydbtarihcevir($fattar).'"';
	
	$rafmgz=$_SESSION['SESBOLGE'];
	if($_SESSION['SESBOLGE']!='') $bolge_sart=" and sbcikmas.mgzkod=".$_SESSION['SESBOLGE'].' '; 
	$sirket_sart=" AND  sbcikmas.sirkod  =  ".$_SESSION['SESSIRKOD'];
	
	$sql="create temporary table kayitactmp
	SELECT
	round(avg(sira)) as sira,  
	sbcikmas.sirkod,sbcikmas.fatno,sbcikmas.fattar,
	  mamul.mamno,  
	  sum(sbcikhar.adet) as adet
	FROM sbcikmas,  mamul,
	  sbcikhar,  bolge,
	  magaza
	WHERE
	  ( bolge.sirkod=magaza.sirkod and bolge.bolkod=left(magaza.mgzkod,2)  )
	  
	  AND  ( sbcikmas.sirkod=sbcikhar.sirkod and sbcikmas.mgzkod=sbcikhar.mgzkod and 
	  sbcikmas.frmno=sbcikhar.frmno and sbcikmas.fattar=sbcikhar.fattar and sbcikmas.fatno=sbcikhar.fatno  )
	  AND  ( magaza.sirkod=sbcikmas.sirkod and magaza.mgzkod=sbcikmas.mgzkod  )
	  AND  ( mamul.mamno=sbcikhar.mamno  )";
	$sql.=$bolge_sart." ".$sirket_sart.$sipsart1."
	 GROUP BY  2, 3, 4,5 order by 1 ";
	//print($sql.'<br />');
	infsqlexec($sql);
	/////////elde edilen temp tabloda sıra numarası aynı olan satırlar varsa bunların sıra noları tablonun sonuna yeni siranoları ile değiştirilecek
		$sql='select * from kayitactmp order by sira';
		//print($sql.'<br />');
		$tmpdizi=infsqlopen($sql);
		if ($tmpdizi!=0)
		{
			$fisfatnolar.=',';
			$fisfattrhler.=',';
			$fisfatnolar.=$fatno;		
			
			$fisfattrhler.=$fattar;
			$ks=count($tmpdizi);
			$sonkno=$tmpdizi[$ks][sira];
			$eskisirano=$tmpdizi[1][sira];
			for ($k=2;$k<=$ks;$k++)
			{
				if ($eskisirano==$tmpdizi[$k][sira])
				{
					$sonkno++;
					$sql='update kayitactmp set sira='.$sonkno.' where sirkod='.$tmpdizi[$k][sirkod].' and 
					fatno="'.$tmpdizi[$k][fatno].'" and fattar="'.ekrantrhmydb($tmpdizi[$k][fattar]).'" 
					and mamno="'.$tmpdizi[$k][mamno].'" and sira="'.$tmpdizi[$k][sira].'"';
					//print($sql.'<br />');
					infsqlexec($sql);
				}
				$eskisirano=$tmpdizi[$k][sira];
			}
		}
	/////////////////////////////////////////
	$sql='insert into '.$rafharekettbl.' (syt_id,syt_sirkod,syt_mgz,syt_tip,syt_aktarmano,syt_kayittrh,syt_degistrh,syt_sipno,syt_usr,syt_mamul,syt_adet,syt_yukno,syt_fistarihi,syt_durum,syt_saat,syt_degissaat)
	select (select max(syt_id) from '.$rafharekettbl.')+sira,2,"'.$_SESSION['SESMODULMGZ'].'",14,sira,date(now()),date(now()),"'.$acfisno.'","'.$_SESSION['SESUYEADI'].'",
	mamno,adet,fatno,fattar,1,time(now()),time(now()) from kayitactmp';
	//print($sql.'<br />');
	infsqlexec($sql);
	
	$sql='drop table kayitactmp';
	//print($sql.'<br />');
	infsqlexec($sql);

}


		$secsirkod=$_SESSION['SESSIRKOD'];
		
		
		$fisfatnolar='';		
		$fisfattrhler='';
		transbaslat();
		echo "trnbaslat<br>";
		if (!is_numeric($acfisno)) 
		{
			$acfisno=1;	
			$str=infsqlopen('select max(ozf_fisno) as idno from '.$ozelfistbl.' where ozf_tur="U" and 
			ozf_sirkod=2 and ozf_mgz="'.$_SESSION['SESMODULMGZ'].'"');
			if ($str!=0)
			{
				$acfisno=$str[1]['idno'];
				$acfisno=$acfisno+1;
			}	
			$MYTARIH=date('d-m-Y');
			$query='insert into '.$ozelfistbl.' (ozf_tur,ozf_sirkod,ozf_mgz,ozf_fisno,ozf_aciklama,
			ozf_usr,ozf_kayittrh,ozf_durum,ozf_ozelkod1) values 
			("U","2","'.$_SESSION['SESMODULMGZ'].'","'.$acfisno.'","00000",
			"'.$_SESSION['SESUYEADI'].'","'.$MYTARIH.'",1,"'.$_SESSION['SESBOLGE'].'")';
			echo $query."<br>";
			infsqlexec($query);
			$_SESSION['SESURTSBFISNO']=$acfisno;
		} else
		{
			$MYTARIH=date('d-m-Y');
			$sql='select * from '.$ozelfistbl.' where ozf_sirkod=2 and ozf_mgz="'.$_SESSION['SESMODULMGZ'].'" and ozf_tur="U" and ozf_fisno="'.$acfisno.'"';
			$dizi=infsqlopen($sql);
			if ($dizi==0)
			{
				$query='insert into '.$ozelfistbl.' (ozf_tur,ozf_sirkod,ozf_mgz,ozf_fisno,ozf_aciklama,
				ozf_usr,ozf_kayittrh,ozf_durum,ozf_ozelkod1) values 
				("U","2","'.$_SESSION['SESMODULMGZ'].'","'.$acfisno.'","00000",
				"'.$_SESSION['SESUYEADI'].'",date(now()),1,"'.$_SESSION['SESBOLGE'].'")';
				echo $query."<br>";
				infsqlexec($query);
			} else
			{
				$query="update $ozelfistbl set ozf_tur='U',ozf_sirkod='2',ozf_mgz='".$_SESSION['SESMODULMGZ']."',ozf_aciklama='00000',
				ozf_usr='".$_SESSION['SESUYEADI']."',ozf_kayittrh=date(now()),ozf_durum=1,ozf_ozelkod1='".$_SESSION['SESBOLGE']."'
				where ozf_sirkod=2 and ozf_mgz='".$_SESSION['SESBOLGE']."' and ozf_tur='U' and ozf_fisno='$acfisno'";
				echo $query."<br>";
				infsqlexec($query);
			}
			$_SESSION['SESURTSBFISNO']=$acfisno;
		}
		////////1.secenek tek fisin secilmesi durumu

		$sql='delete from '.$rafharekettbl.' where syt_tip=14 and syt_sipno="'.$acfisno.'" and syt_sirkod="2" and syt_mgz="'.$_SESSION['SESMODULMGZ'].'"';
		infsqlexec($sql);


		if ($fattar!=''&&$fatno!='')
		{
			sbcikfatfisyukle($fatno,$fattar);
		} else
		{
			////////2.secenek tek fisin secilmesi durumu
			if($_SESSION['SESBOLGE']!='') $bolge_sart=" and sbcikmas.mgzkod=".$_SESSION['SESBOLGE'].' '; 
			if ($_SESSION['SESSIRKOD']!='') $sirket_sart=" AND  sbcikmas.sirkod  =  ".$_SESSION['SESSIRKOD'];
			$sql="SELECT sbcikmas.fattar, sbcikmas.fatno, firma.unv1 as unvan,
			  sbcikmas.frmno FROM sbcikmas, firma, bolge, magaza
			WHERE
			  ( bolge.sirkod=magaza.sirkod and bolge.bolkod=left(magaza.mgzkod,2)  )
			  
			  AND  ( magaza.sirkod=sbcikmas.sirkod and magaza.mgzkod=sbcikmas.mgzkod  )
			  AND  ( firma.frmno=sbcikmas.frmno  )
			  and not exists(select * from $ozelfistbl where 
			  ozf_tur='U' and ozf_sirkod=2 and ozf_mgz='".$_SESSION['SESMODULMGZ']."' and 
			  ozf_aciklama like concat('%,',trim(sbcikmas.fatno),',%') 
			  and ozf_aciklama like concat('%,',date(ozf_kayittrh),',%'))
			   ".$bolge_sart." ".$sirket_sart."
			 order by 2 DESC ";
			// print($sql);
			$dizi=infsqlopen($sql);
			$checksay=0;
			
			$secsips='';
	
			if ($dizi!=0)
			for ($i=1; $i<=1000&&$i<=count($dizi); $i++ ) 
			{
				
				$chkname='check'.$checksay;
				//print($chkname.$_POST[$chkname].',');
				if ($_POST[$chkname]=='1')
				{
					$fatno=$dizi[$i]['fatno'];
					$fattar=ekrantarih($dizi[$i]['fattar']);
					sbcikfatfisyukle($fatno,$fattar);
				}
				$checksay++;
			}
		}  ////end 2.secenek(coklu fis secimi)
		
		if ($fisfattrhler!='')
			$fisaciklama=$fisfatnolar.',;'.$fisfattrhler.',;';
		else $fisaciklama='';
		////kayıt kontrol yapılacak.
		$sql="select ozf_fisno from $ozelfistbl where 
		ozf_sirkod=2 and ozf_mgz='".$_SESSION['SESMODULMGZ']."' and ozf_tur='U' 
		and ozf_aciklama='$fisaciklama' and ozf_fisno<>'$acfisno'";
		$kbdizi=infsqlopen($sql);
		if ($kbdizi!=0) $kbno=$kbdizi[1]['ozf_fisno'];else $kbno="";
		if ($kbno!="")
		{
			echo "trnrollback<br>";
			transiptalet();
			odbckapat();
			mesajilecikis("Hata !","Ayni faturalar '$kbno' numarali kayit ile acilmistir. Lutfen bu kayiti kullaniniz.");
		} else
		{
			if ($fisaciklama!='')
			{		
				$query="update $ozelfistbl set ozf_tur='U',ozf_sirkod='2',ozf_mgz='".$_SESSION['SESMODULMGZ']."',
				ozf_aciklama='$fisaciklama',
				ozf_usr='".$_SESSION['SESUYEADI']."',ozf_kayittrh=date(now()),ozf_durum=1,ozf_ozelkod1='".$_SESSION['SESBOLGE']."'
				where ozf_sirkod=2 and ozf_mgz='".$_SESSION['SESMODULMGZ']."' and ozf_tur='U' and ozf_fisno='$acfisno'";
				echo $query."<br>";

				infsqlexec($query);
				$urladresi='2;url=sipmenu.php';
				$mesaj='Kayitlar hazirlandi. ';
			} else
			{
					$query='delete from '.$ozelfistbl.' where ozf_sirkod=2 and ozf_mgz="'.$_SESSION['SESMODULMGZ'].'" and ozf_tur="U" and ozf_fisno="'.$acfisno.'"';
					echo $query."<br>";
					infsqlexec($query);
					$urladresi='2;url=fislistesi.php';
					$mesaj='Hicbir kayit secilmedi !';
				$_SESSION['SESURTSBFISNO']='';
			}
			echo "trncommit<br>";
			transonayla();
		}
		echo "odbckapat<br>";
  		odbckapat();
		
		
		echo '<meta http-equiv="refresh" content="'.$urladresi.'">'. $mesaj.
		'<br> Lutfen 1 sn bekleyiniz...';
?>
omurolmez
Üye
Mesajlar: 187
Kayıt: 31 Eki 2012 11:41

Re: mysql rollback çalışmıyor

Mesaj gönderen omurolmez »

Hatanın aklıma gelen dört olası nedeni,

1. Yaptığınız bir hareket otomatik olarak commit e neden oluyor (örneğin dataset in kapatılması ya da yokedilmesi) (implicit commit). *****
2. kod içinde gözünüzden kaçan bir yerde doğrudan commit komutu çalıştırıyorsunuz. ***
3. Bir ddl deyimi çalıştırıyorsunuz ve mysql veya kullandığınız bileşen seti (ddl auto commit) biçiminde konfigüre edilmiş. Yani, insert, update, delete (dml) deyimi çalıştırdığınız bir transaction içinde takiben alter table, vb bir deyim çalıştırıyorsunuz ve sistem arada gereken commit ifadesini sizin için ekliyor(ddl auto commit).
4. rollback komutu uyguladığınızda mysql bir hata döndürüyor ve siz bu hatayı yakalamıyorsunuz.
Ömür Ölmez
Kullanıcı avatarı
husonet
Admin
Mesajlar: 2962
Kayıt: 25 Haz 2003 02:14
Konum: İstanbul
İletişim:

Re: mysql rollback çalışmıyor

Mesaj gönderen husonet »

Ayrıca Tabloları MyIsam kullanıyor olabilirsiniz MyIsam transaction desteklemez InnoDB kullanmalısınız. Tekrar check edermisiniz.

Kolay gelsin...

Gazete manşetleri
* DİKKAT :Lütfen forum kurallarını okuyalım ve uyalım...!
* Warez,crack vs. paylaşımı kesinlikle yasaktır.
Cevapla