Sorunun kendisinin oldukça açıklayıcı olduğunu düşünüyorum. Kod aşağıda verilmiştir - Ben catch bloğunun içinde hareketi geri am bileAşağıdaki PDO işlemi neden çalışıyor?
<?php
$PDO = NULL;
$pdo_dsn = 'mysql:host=localhost;dbname=pdo_test';
$pdo_persistence = array(PDO::ATTR_PERSISTENT => true);
$db_user = 'root';
$db_pass = '';
$db_query = "INSERT INTO person(name, address)
VALUES ('Mamsi Mamsi', 'Katabon')";
try
{
$PDO = new PDO($pdo_dsn, $db_user, $db_pass,
$pdo_persistence);
}
catch(PDOException $e)
{
echo "Error occured: ". $e->getMessage();
die();
}
$PDO->setAttribute(PDO::ATTR_ERRMODE,
PDO::ERRMODE_EXCEPTION);
$PDO->setAttribute(PDO::ATTR_AUTOCOMMIT, false);
try
{
$PDO->beginTransaction();
$PDO->exec($db_query);
throw new PDOException('Generated Exception');
$PDO->commit();
}
catch(PDOException $e)
{
echo "An error occured while doing a database transaction. The
error message is : ".$e->getMessage();
$PDO->rollBack();
die();
}
?>
, veriler hala veritabanına eklenen ediliyor. Niye ya?
ben fazla açıklama için documentation aşağıdaki birkaç satır ekliyorum
DÜZENLEME - PDO olarak bilinen çalışmasına ihtiyacı Maalesef
, aşağıdaki satırları -, her veritabanı işlemleri destekler bağlantısını ilk açtığınızda "otomatik taahhüt" modu. Otomatik tamamlama modu veritabanı destekliyorsa, ya da hiç işlem veritabanı işlemleri desteklemiyorsa çalıştırmak her sorgu, kendi örtük işlem olduğu anlamına gelir. işlemine gereksiniminiz varsa, kodunu başlatmak için PDO :: beginTransaction() yöntemini kullanmanız gerekir. Temel sürücü işlemleri desteklemiyorsa, bir PDOException ( ayarlarının hata ayıklama işleminden bağımsız olarak) atılacaktır: bu her zaman ciddi bir hata durumudur). Eğer bir işlem olup kez işlem sırasında çalışacak kodun başarı durumuna bağlı olarak bitirmek için PDO :: işlemek kullanabilir() veya PDO :: rollBack(). this sayfadan Ayrıca
bool PDO::beginTransaction (void )
autocommit modunu kapatır. autocommit modu kapalıyken PDO nesne örneği üzerinden veritabanına yapılan değişiklikler PDO arayarak işlemi sona kadar işlememiş vardır :: taahhüt(). PDO :: rollBack() yönteminin çağrılması, tüm değişiklikleri veritabanına geri alır ve bağlantıyı otomatik kabul moduna döndürür. Bir veritabanı tanımlama dili (DDL) deyimi gibi DROP TABLE veya CREATE TABLE bir hareket içinde kesilirken MySQL dahil
bazı veritabanları, otomatik olarak bir örtülü COMMIT yayınlanabilecek. örtülü COMMIT, işlem sınırı içinde diğer tüm değişiklikleri geri almanızı önleyecektir.
Şu anda bir istisna attığınız işlemi geri alırsanız ne olur? – Amber
@Amber: bu bir :( –