2013-04-04 135 views
1

我有一些PHP代碼,它使用PHPExcel讀取電子表格並將數據導入MySQL數據庫。 (innoDB)如果導入在數據庫中遇到重複記錄,它應該會失敗並回滾所有以前的插入。回滾不起作用,我寫了這個功能相同的小程序。PHP事務不回滾

$conn = null; 
try { 

$conn=new mysqli("myServer","user","password", "moveforward"); 
$conn->autocommit(FALSE); 

$sql="insert into series (seriesLocation,seriesName,seriesDate) values('1','2','2013-05-21')"; 
echo "Executing query 1<br>"; 
$conn->query($sql); 
if($conn->error!="") { 
    $sqlError=$conn->error; 
    $conn->rollback(); 
    echo "Rollback complete<br>"; 
    throw new Exception($sqlError); 
} 

//This will throw a duplicate exception 
echo "Exceuting query 2<br>"; 
$conn->query($sql); 
if($conn->error!="") { 
    $sqlError=$conn->error; 
    $conn->rollback(); 
    echo "Rollback complete<br>"; 
    throw new Exception($sqlError); 
} 
echo "You shouldn't be here<br>"; 

$conn->commit(); 
echo "Transactions comitted<br>"; 

} catch (Exception $e) { 
    echo "Exception: " . $e->getMessage() . "<br>"; 
} 
$conn->close(); 
echo "Done<br>"; 

在查看PHP手冊和檢查這裏的其他帖子看起來應該工作。當我運行它,我得到這個:

Executing query 1 
Exceuting query 2 
Rollback complete 
Exception: Duplicate entry '2' for key 'seriesName' 
Done 

然而,當我檢查數據庫從第一個插入的數據是在那裏。

任何想法?

回答

4

猜猜你的表沒有使用適當的引擎

http://php.net/mysqli.autocommit

此功能不與非事務表類型(如的MyISAM或ISAM)工作。

但是,使用INSERT IGNORE(或REPLACE取決於應該是正確的行爲)要容易得多。在這種情況下,重複的行將被忽略(或替換現有的行(REPLACE))。當然這不起作用,如果你想知道,哪些是重複的。

+0

默認存儲引擎設置爲innodb ....是否還有其他我需要做的事情? – Striker 2013-04-04 20:46:07

+0

看看哪些表正在運行。有一個很好的機會,他們使用相同的引擎作爲默認的引擎,但我自己會看看它;) – KingCrunch 2013-04-04 20:52:17

+0

就是這樣。我從來沒有意識到你可以混合和匹配。我改變了它,現在它完美地工作。謝謝! – Striker 2013-04-04 21:33:08