事務
●事務(transaction)是對資料庫的若干操作組成的乙個執行單元。這些操作要麼全部執行,要麼都取消,從而保證了資料庫滿足一致性的要求
通常,事務是有一組sql語句組成,包括查詢語句和
dml(
資料操縱語句
data manipulationlanguage)語句。
當然,事務也可以是乙個sql語句
●事務的
acid
四大特性:
(1)原子性
(atomicity):
事務中包含的操作要麼全部都做,要麼全部都不做。
(2)一致性
(consistency):
事務成功執行的結果必須是使資料庫從乙個狀態轉變到另乙個狀態,前後保證資料庫的完整性約束,
一旦運算元據庫的過程當中出現故障,事務提交回滾,恢復資料。
(3)隔離性
(isolation):乙個事務的執行不會被其他的事務所干擾。即乙個事務內部的操作及使用的資料對其他併發事務是隔離的,併發執行的各個事務之間不能相互干擾。
(4)持續性
(durability)
:也稱永續性,只乙個事務一旦提交,它對資料庫中的資料改變是永久性的,後續的其他操作或者故障不影響其執行的結果。
●事務的開始:
當執行了一條查詢語句或者dml語句,此時便自動開啟乙個事務
●事務的結束:
執行了commit或者
rollback
語句;使用exit命令退出
sqlplus
時,自動的提交事務
●併發事務:
多個使用者同時和同乙個資料庫互動,每個使用者各自執行在自己的事務中,稱為併發事務
併發事務可能存在的問題:
假設有兩個事務t1和
t2同時對同乙個表進行操作
(1)幻讀:
t1開始檢索表中的資料,之後
t2又向表中的插入或刪除了一條資料,
t1有基於同樣的查詢條件來檢索該錶,發現多出來一條或少一條資料
(2)不可重複讀:
t1讀取了某條資料,然後
t2修改了剛剛
t1讀取的這條資料,
t1又讀取了這條資料,結果發現這條記錄和剛剛讀取的這條資料不一樣
(3)髒讀:
t1修改了某條記錄,然後
t2讀取了剛剛
t1修改的這條記錄,然後
t1回滾了這條記錄,
t2拿到的就是髒資料(無效資料)
●為了避免上述問題,
sql標準彙總定義了不同的事務隔離級別,從低往高一次為:
readcommitted:事務
t1只讀取事務
t2提交後的資料,這個級別的隔離性避免了髒讀,但不可避免幻讀和不可重複讀問題;
readrepeatable:事務
t1中讀取到的資料是一致性的,即使在
t2中修改了該條資料。這個隔離級別避免了不可重複讀和髒讀;
serializable:事務t1和
t2的執行效果等效於序列
(前面併發事務出現的問題幾乎對它不可見
) oracle只支援兩種事務隔離級別:
read
committed和 serializable,並且
oracle
中事務預設的隔離級別是:
read
committed
●改變當前會話的事務隔離級別:
alter session set isolation_level= [levelname];
serializable級別是因為該關係型資料庫管理系統為當前使用者所對應模式下的資料進行了備份
(放入緩衝區當中
),然後其他事務修改記錄,對於該使用者所獲取的資料就會先從緩衝區中拿到,資料依然沒有修改;資料庫管理系統也會為記錄標記,其他事務沒有提交,則該使用者操作此條記錄,也
不允許提交!(例:併發事務操作同乙個表中的同一條記錄)
認識ORACLE中的dual表
dual表是乙個虛擬表,用來構成select的語法規則,oracle保證dual裡面永遠只有一條記錄。常用在沒有目標表的select語句塊中。活用dual表的一些常見用法,可以使你的sql更容易形成預期的結構 連線兩個字串 結果 使用nvl函式 結果 這些用nvl判斷過後的值可以直接用來給別的ins...
MySQL事務(一)認識事務
簡單來說,事務就是要保證一組資料庫操作,要麼全部完成,要麼全部失敗。資料庫中的資料是共享資源,因此資料庫系統通常要支援多個使用者的或不同應用程式的訪問,會出現併發訪問資料的現象。資料庫系統必須對這種併發操作提供一種相應的處理機制來保證,訪問彼此之間不受任何干擾,從而保證資料庫的正確性不受到破壞,這種...
oracle中的事務隔離級別
印象中oracle是支援4種標準的隔離級別的,但是今天在測試中,發現oracle只支援讀提交和序列化2個隔離級別,汗!sql alter session set isolation level read uncommitted alter session set isolation level re...