數據庫中的事物處理
數據庫的更新通常都是由客觀世界的所發生的事件引起的。為保證數據庫內容的一致,就要將數據庫的一組操作作為一個整體來進行,要么全部成功完成,要么全部失敗退出。如果由于故障或其它原因而使一組操作中有一些完成,有一些未完成,則必然會使得數據庫中的數據出現不一致,從而使得數據庫的完整性受到破壞。因此,更新操作序列必須作為一個整體在DBMS執行時出現,即“要么全做,要么全不做”。SQL提供了事務處理的機制,來幫助DBMS實現上述的功能。
事務處理
事務處理(TRANSACTION)的每個語句是由一個或多個SQL語句序列結合在一起所形成的一個邏輯處理單元。事務處理中句都是完成整個任務的一部分工作,所有的語句組織在一起能夠完成某一特定的任務。DBMS在對事務處理中的語句進行處理時,是按照下面的約定來進行的,這就是“事務處理中的所有語句被作為一個原子工作單位,所有的語句既可成功地被執行,也可以沒有任何一個語句被執行”。DBMS負責完成這種約定,即使在事務處理中應用程序異常退出,或者是硬件出現故障等各種意外情況下,也是如此。在任何意外情況下,DBMS都負責確保在系統恢復正常后,數據庫內容決不會出現“部分事務處理中的語句被執行完”的情況。
sql語言
sql語言為事務處理提供了兩個重要的語句,它們是COMMIT和ROLLBACK語句。它們的使用格式是:
COMMIT WORK
ROLLBACK WORK
COMMIT語句用于告訴DMBS,事務處理中的語句被成功執行完成了。被成功執行完成后,數據庫內容將是完整的。而ROLLBACK語句則是用于告訴DBMS,事務處理中的語句不能被成功執行。這時候,DBMS將恢復本次事務處理期間對數據庫所進行的修改,使之恢復到本次事務處理之前的狀態。
事務處理:
QSqlDatabase::database().transaction(); QSqlQuery query; query.exec("SELECT id FROM employee WHERE name = 'Torild Halvorsen'"); if (query.next()) { int employeeId = query.value(0).toInt(); query.exec("INSERT INTO project (id, name, ownerid) " "VALUES (201, 'Manhattan Project', " + QString::number(employeeId) + ")"); } QSqlDatabase::database().commit(); |
如果數據庫引擎支持事務處理,則函數QSqlDriver::hasFeature(QSqlDriver::Transactions)將返回 真。
可以通過調用QSqlDatabase::transaction()來初始化一個事務處理。之后執行你想在該事務處理的工作。
完了再執行QSqlDatabase::commit()來提交事務處理或QSqlDatabase::rollback()取消事務處理。
posted on 2014-09-16 09:51 順其自然EVO 閱讀(197) 評論(0) 編輯 收藏 所屬分類: 測試學習專欄