2012-03-15 204 views
2

我正在爲使用PHP的mysql數據庫編寫升級程序。升級程序的行爲應該如下。使用MySql事務CREATE TABLE事務

  • 如果所有查詢都成功執行,則應該提交更改。
  • 如果一個sinngle查詢得到faild eveything應該回到previouse狀態。

我的部分程序如下。

$host = 'localhost'; 
$user = 'root'; 
$password = 'root'; 
$db = 'transaction'; 
$con = mysqli_connect($host, $user, $password); 
mysqli_select_db($con, $db); 
mysqli_autocommit($con, FALSE); 

$query1 = "create table `status` (
         `id` int not null auto_increment, 
         `name` varchar(60) not null, 
        primary key (`id`) 
        ) engine=innodb default charset=utf8;"; 
$result1 = mysqli_query($con, $query1); 
$query2 = "ALTER TABLE status 
        CHANGE name value varchar(512);"; 

$result2 = mysqli_query($con, $query2); 

if(!($result1 && $result2)) { 
    mysqli_rollback($con); 
} else { 
    mysqli_commit($con); 
} 

mysqli_close($con); 

但是,如果「狀態」表已經存在的第一次創建表查詢失敗。所以這兩個查詢應該回滾。但是alter query已經執行並且沒有回滾。

我看到一篇文章列出了所有不能在mysql中回滾的查詢。 http://www.sitepoint.com/mysql-transaction-gotchas-good-parts/

是否有任何可能的方式在mysql中執行此角色。

+1

我會做的第一件事是做一個數據庫的備份,如果你打算開始改變它的結構。 – 2012-03-15 08:42:25

+0

是的@EdHeal。我在原始數據庫的副本上運行這些命令。所以如果事情失敗了,我可以用手動轉儲代替副本。但問題是我需要自動執行。 – Thilanka 2012-03-16 09:47:43

+0

只要確保。這是容易忘記的事情。 – 2012-03-16 17:24:24

回答

1

不需要。您需要運行一個新的alter table查詢,撤消前一個alter語句。

+0

感謝@llion的快速回復。我可以手動完成,因爲這是一個小改變。但問題是這是我的腳本的一小部分,它包含150個這樣的表創作和改變。所以手動操作很困難。是否有自動的方式將其回滾到初始狀態。 – Thilanka 2012-03-16 09:48:05

1

做manualy

if(!($result1 && $result2)) { 

    #drop table 
    $query1 = "drop table `status`"; 
    $result = mysqli_query($con, $query1); 

} 
+0

感謝@Haim Evgi的快速回復。我可以手動完成,因爲這是一個小改變。但問題是這是我的腳本的一小部分,它包含150個這樣的表創作和改變。所以手動操作很困難。是否有自動的方式將其回滾到初始狀態。 – Thilanka 2012-03-16 09:44:07

0

它會更好,只是將數據導出到(比方說)的CSV文件的集合。然後修改任何需要匹配新結構的數據。然後,只需創建具有新結構的數據庫並將數據導入到其中。

似乎嘗試製作升級程序的更簡單的解決方案。

+0

否@Ed Heal假定在過程中出現錯誤。由於這種系統升級是由現有用戶完成的,所以他們自己很難做到這一點。他們只需要一次點擊升級。所以我們必須這樣做,如果出現問題,我們應該能夠將更改回歸到初始狀態。 – Thilanka 2012-03-18 09:46:05

+0

我很務實。你提出了一個問題,那就是可能南下。我剛提供了一個更安全的解決方案 – 2012-03-18 14:52:40