2016-10-12 33 views
0

假設我有這樣的代碼在交易中。每次失敗都需要回滾嗎?或者沒有提交退出腳本就足夠了?

$transactionfailed = false; 
$mysqliconn->query("begin;"); 
//query 1 
$result=$mysqliconn->query("insert into table(col1,col2) values('$val1','val2')"); 
if(!$result){$transactionfailed=true;} 
//query 2 
$result=$mysqliconn->query("insert into table2(col1,col2) values('$val1','val2')"); 
if(!$result){$transactionfailed=true;} 
if($transactionfailed){$mysqliconn->query("rollback;");} 
else{$mysqliconn->query("commit;");} 
die(); 

我想取代它這一個

$mysqliconn->query("begin;"); 
//query 1 
$result=$mysqliconn->query("insert into table(col1,col2) values('$val1','val2')"); 
if(!$result){die("error");} 
//query 2 
$result=$mysqliconn->query("insert into table2(col1,col2) values('$val1','val2')"); 
if(!$result){die("error");} 
$mysqliconn->query("commit;"); 
die(); 

我想結束腳本,如果發生了什麼錯誤,而不回滾或承諾,取決於MySQL數據庫如果我沒有提交,則回滾事務。

我試了很多次,是的,如果我沒有提交退出,它會回滾事務。但是這一次是安全的嗎?。或者有我想念的東西。因爲我不希望那個查詢2失敗,查詢1在一天後提交。

+0

它更好注意安全。如果不是這樣,後果在全球範圍內將非常可怕。 – apokryfos

回答

0

我建議使用try/catch塊,
把「開始」 try塊之前查詢
把你的「插入」查詢try塊
把你的「回滾」查詢catch塊
如果沒有查詢在try塊中最後一次提交失敗
如果try塊中的任何查詢失敗一次在catch塊中(回滾開始查詢後的所有查詢都將被回滾)