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