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.
mysql rollback çalışmıyor
Re: mysql rollback çalışmıyor
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
http://www.w3schools.com/php/func_mysqli_rollback.asp
Re: mysql rollback çalışmıyor
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...';
?>
Re: mysql rollback çalışmıyor
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.
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
Re: mysql rollback çalışmıyor
Ayrıca Tabloları MyIsam kullanıyor olabilirsiniz MyIsam transaction desteklemez InnoDB kullanmalısınız. Tekrar check edermisiniz.
Kolay gelsin...
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.