事務及事務的特點歸納
阿新 • • 發佈:2018-12-25
事務:
事務是指作為單個邏輯工作單元執行的一組相關操作。
這些操作要求全部完成或者全部不完成。
使用事務的原因:保證資料的安全有效。
事務的四個特點:(ACID)
1、原子性(Atomic):事務中所有資料的修改,要麼全部執行,要麼全部不執行。
2、一致性(Consistence):事務完成時,要使所有所有的資料都保持一致的狀態,換言之:通過事務進行的所有資料修改,必須在所有相關的表中得到反映。
3、隔離性(Isolation):事務應該在另一個事務對資料的修改前或者修改後進行訪問。
4、永續性(Durability):保證事務對資料庫的修改是持久有效的,即使發生系統故障,也不應該丟失。
事務組成:
一條或者多條DML,[一條DDL]和一條DCL。
事務的分類:
1、顯式事務:
(1)要去顯式的呼叫DCL。
(2)只有用到COMMIT以後才會真正寫入資料庫,也持久化了。
2、隱式事務:
(1)如果人工要使用隱式事務,SET AUTOCOMMIT ON (只針對一個連線)
(2)以下情況為自動提交:
1)正常執行完成的DDL語句:create、alter、drop
2)正常執行完場的DCL語句GRANT、REVOKE
3)正常退出的SQLPlus或者SQL Developer等客戶端
回滾:
髒讀(Dirty Read):事務T1更新了一行資料,還沒有提交所做的修改,T2讀取更新後的資料,T1回滾,T2讀取的資料無效,這種資料稱為髒讀資料。
不可重複讀(UNrepeatable Read):事務T1讀取一行資料,T2修改了T1剛剛讀取的記錄,T1再次查詢,發現與第一次讀取的記錄不相同,稱為不可重複讀。
幻讀(Phantom Read):事務T1讀取一條帶WHERE條件的語句,返回結果集,T2插入一條新紀錄,恰好也是T1的WHERE條件,T1再次查詢,結果集中又看到T2的記錄,新紀錄就叫做幻讀。
隔離級別:
NO_TRANSACTION 不支援事務
READ_UNCOMMITED 允許髒讀、不可重複讀、幻讀
READ_COMMITED 允許不可重複讀、幻讀,不允許髒讀
REPEATABLE 允許幻讀,不允許髒讀、不可重複讀
SERIALIZABLE 髒讀、不可重複讀、幻讀都不允許
加了共享鎖的資料,可以被其他事物讀取,但不能修改。如select語句。
為了保證效能:樂觀鎖,悲觀鎖
悲觀鎖:每次都是假設資料肯定會衝突,資料開始讀取時就把資料給鎖住。
樂觀鎖:每次都是假設一般情況下不會發生資料衝突,只有資料更新提交的時候,才會對資料的衝突與否進行檢測,如果發生衝突,返回錯誤資訊讓使用者處理。
事務是指作為單個邏輯工作單元執行的一組相關操作。
這些操作要求全部完成或者全部不完成。
使用事務的原因:保證資料的安全有效。
事務的四個特點:(ACID)
1、原子性(Atomic):事務中所有資料的修改,要麼全部執行,要麼全部不執行。
2、一致性(Consistence):事務完成時,要使所有所有的資料都保持一致的狀態,換言之:通過事務進行的所有資料修改,必須在所有相關的表中得到反映。
3、隔離性(Isolation):事務應該在另一個事務對資料的修改前或者修改後進行訪問。
4、永續性(Durability):保證事務對資料庫的修改是持久有效的,即使發生系統故障,也不應該丟失。
事務組成:
一條或者多條DML,[一條DDL]和一條DCL。
事務的分類:
1、顯式事務:
(1)要去顯式的呼叫DCL。
(2)只有用到COMMIT以後才會真正寫入資料庫,也持久化了。
2、隱式事務:
(1)如果人工要使用隱式事務,SET AUTOCOMMIT ON (只針對一個連線)
(2)以下情況為自動提交:
1)正常執行完成的DDL語句:create、alter、drop
2)正常執行完場的DCL語句GRANT、REVOKE
3)正常退出的SQLPlus或者SQL Developer等客戶端
回滾:
RollBack只能對未提交的資料撤銷,已經Commit的資料是無法撤銷的,因為commit之後已經持久化到資料庫中。
不可重複讀(UNrepeatable Read):事務T1讀取一行資料,T2修改了T1剛剛讀取的記錄,T1再次查詢,發現與第一次讀取的記錄不相同,稱為不可重複讀。
幻讀(Phantom Read):事務T1讀取一條帶WHERE條件的語句,返回結果集,T2插入一條新紀錄,恰好也是T1的WHERE條件,T1再次查詢,結果集中又看到T2的記錄,新紀錄就叫做幻讀。
隔離級別:
NO_TRANSACTION 不支援事務
READ_UNCOMMITED 允許髒讀、不可重複讀、幻讀
READ_COMMITED 允許不可重複讀、幻讀,不允許髒讀
REPEATABLE 允許幻讀,不允許髒讀、不可重複讀
SERIALIZABLE 髒讀、不可重複讀、幻讀都不允許
Oracle支援SQL92標準的READ_COMMITED、SERIALIZABLE,自身特有的READ_ONLY
鎖:
排它鎖:(X鎖,eXclusive LockS)
當有DML語句執行的時候,設計的行都會加上排它鎖,其他事物不能進行讀取修改。
共享鎖:(S鎖,Shared Locks)加了共享鎖的資料,可以被其他事物讀取,但不能修改。如select語句。
為了保證效能:樂觀鎖,悲觀鎖
悲觀鎖:每次都是假設資料肯定會衝突,資料開始讀取時就把資料給鎖住。
樂觀鎖:每次都是假設一般情況下不會發生資料衝突,只有資料更新提交的時候,才會對資料的衝突與否進行檢測,如果發生衝突,返回錯誤資訊讓使用者處理。