簡體   English   中英

如何使用perl腳本在mysql中插入時使操作原子化

[英]How to make operation atomic while inserting in mysql using perl script

我有一個perl腳本,為客戶下訂單。

2桌。

table_orders - orderic, customerid, orderdatetime
table_order_details - orderid, productname, Quantity, MRP. Sellprice

插入表格的步驟:

1. insert in table_orders.
2. for each product in shopping cart insert into table_order_details

現在問題是插入第一個表后,

1. It is possible because of some error in input data insertion in second table is not possible and perl returns an error.
2. Few entries done in table 2 too, but now got the error so further entry not possible in table 2 and perl returns an error.

在這兩種情況下,事務未成功完成,那么如何恢復在發生錯誤之前完成的DB中的條目?

有沒有perl或MYSQl wat來做這個或我們需要手動處理?

使用交易

事務允許您隔離對數據庫的更改,直到您完成所有更改。 在您處理交易時,沒有其他人可以看到這些更改,也沒有其他人可以更改這些行。 然后你commit交易,其他人都可以一次看到你的變化。 如果出現錯誤,您可以rollback在事務中所做的所有更改。

在Perl中,使用DBI,默認情況下不使用事務。 每個語句都會自動提交。 始終打開交易是一個非常好的主意。 通常,通過將AutoCommit設置為off來連接到數據庫時,可以執行此操作。 您還需要啟用RaiseError,因此數據庫錯誤將自動發生,您無需編寫or die...無處不在。 然后,由於您不希望兩次看到錯誤,請關閉PrintError

my $dbh = DBI->connect(
    'dbi:mysql:...', $user, $pass,
    { AutoCommit => 0, RaiseError => 1, PrintError => 0 }
);

現在你所做的一切都將在一個事務中,除非你運行$dbh->commit否則你所做的一切都不會被其他人看到。 將所有工作包裝在eval塊中,以捕獲在RaiseError拋出的任何錯誤。 如果出現錯誤, $dbh->rollback將丟棄任何部分工作。

eval {
    my $insert_table_orders_sth = $dbh->prepare(
        "INSERT INTO table_orders (...) VALUES (?, ?, ?)"
    );
    $insert_table_orders_sth->execute(@table_orders_values);

    my $insert_table_orders_details_sth = $dbh->prepare(
        "INSERT INTO table_orders_details (...) VALUES (?, ?, ?)"
    );
    for my $product ($cart->products) {
        $insert_table_orders_details_sth->execute($product->values);
    }

    # All done, make the changes visible to everyone else.
    $dbh->commit;
};
if($@) {
    warn "There was a database error: $@";

    # Wipe out anything you did above.
    eval { $dbh->rollback };

    # Do whatever else you might need to cleanup the error.
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM