oracle 中的事務
原子性:是指事物中包含的所有操作要麼全做,要麼全不做,也就是說事物的所有活動在資料庫中要麼全部反映,要麼全部不反映,一保證資料時一致的。
一致性:是指資料庫在事務操作前和操作處理,其中的資料必須都滿足業務規定的約束。
隔離性:是指資料庫允許多個併發事務同時對其中的資料進行讀寫好修改的能力,隔離性可以防止事務的併發執行時,由於他們的操作命令交叉執行而導致的資料不一致狀態。
永續性:是指當事務結束後,它對資料庫中的影響是永久的,即便系統遇到故障的情況下,資料也不會丟失。
資料庫事務由以下的部分組成:
一個或多個DML 語句
一個 DDL(Data Definition Language – 資料定義語言) 語句
一個 DCL(Data Control Language – 資料控制語言) 語句
事務的執行過程:
以第一個 DML 語句的執行作為開始
以下面的其中之一作為結束:
COMMIT 或 ROLLBACK 語句
DDL 或 DCL 語句(自動提交)
使用者會話正常結束
系統異常終了
備註:使用COMMIT 和 ROLLBACK語句,我們可以: 確保資料完整性;資料改變被提交之前預覽;將邏輯上相關的操作分組。
事務控制語句
Set transaction:設定事務的屬性
Set constrains:設定當前事務的約束模式,設定約束是修改資料的時候,立即起作用,還是當前事務結束後應用。
Savepoint :在事務中建立一個儲存點,回滾時,可以指定回滾到什麼地方,然後重新執行
Release savepoint:刪除一個儲存點
Rollback:回滾事務。級取消對資料庫所做的任何修改
Commit:提交事務,把事務中對資料庫的修改進行永久儲存
資料異常
因為Oracle中支援多個事務併發執行,所以會出現下面的資料異常。
錯讀|髒讀:當user1正在讀資料庫中的表A時,user2正在修改表A,user2修改完了,user1又讀一遍表A,user1讀出的是修改過的資料,而user2又撤消修改了,user1的讀取表A,稱為“錯讀”或者“髒讀”
非重複讀|不重複讀:是指一個事務讀取資料庫中的資料後,另一個事務則更新了資料,當第一個事務再次讀取其中的資料時,就會發現資料已經發生了改變,這就是非重複讀取。非重複讀取所導致的結果就是一個事務前後兩次讀取的資料不相同。
假讀|幻讀:如果一個事務基於某個條件讀取資料後,另一個事務則更新了同一個表中的資料,這時第一個事務再次讀取資料時,根據搜尋的條件返回了不同的行,這就是假讀。
事務中遇到的這些異常與事務的隔離性設定有關,事務的隔離性設定越多,異常就出現的越少,但併發效果就越低,事務的隔離性設定越少,異常出現的越多,併發效果越高。
選擇隔離層
針對3中讀取的資料時產生的不一致現象,在ANSI SQL標準92中定義了4個事務的隔離級別.如下圖所示:
隔離級別 |
錯讀|髒讀 |
非重複讀|不重複讀 |
假讀|幻讀 |
Read uncommitted(非提交讀) |
是 |
是 |
是 |
Read committed(提交讀) |
否 |
是 |
是 |
Repeatable read(可重複讀) |
否 |
否 |
|
Serializable(序列讀) |
否 |
否 |
否 |
Oracle預設的隔離級別是read committed
Oracle支援上述地址隔離層中的兩種read committed和Serializable除此之外oracle中還設定了read only和read write隔離層
Serializable:設定事務的隔離層為它時,
Read only :事務中不能有任何修改資料庫中的資料的操作語句,如insert、update、delete、create語句,read only 是Serializable的子集,區別是read only只讀,Serializable和執行DML語句。
Read write:是預設設定,改選項表示在事務中可以有訪問語句。修改語句。但不經常使用
設定事務的屬性
建立 set transaction的語句
如:
Set transaction read noly
或:
Set transaction read write
或:
Set transaction isolation level read commnitted
或:
Set transaction isolation level serializable
注意:這些語句是互斥的。不能同時設定兩個或兩個以上的選項
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31520497/viewspace-2156861/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- oracle事務Oracle
- oracle的只讀事務Oracle
- 淺談ORACLE的分散式事務Oracle分散式
- MongoDB 中的事務MongoDB
- MyBatis中的事務MyBatis
- Redis 中的事務Redis
- Oracle 巢狀事務 VS 自治事務Oracle巢狀
- 原創:oracle 事務總結Oracle
- [20200512]oracle的事務隔離級別.txtOracle
- 深入理解oracle的事務隔離性Oracle
- Spring 中的事務管理Spring
- MySQL 中的事務理解MySql
- Oracle面試寶典-事務篇Oracle面試
- 查詢oracle正在執行的SQL和事務OracleSQL
- Redis 中的事務分析,Redis 中的事務可以滿足ACID屬性嗎?Redis
- 【JAVA高階】——吃透JDBC中的事務及事務的封裝JavaJDBC封裝
- (四)Spring中的事務管理Spring
- MySQL中的事務和MVCCMySqlMVC
- MySQL 中的事務詳解MySql
- Spring中的事務提交事件Spring事件
- Oracle分散式事務典型案例處理Oracle分散式
- Oracle vs PostgreSQL,研發注意事項(6)- 事務處理OracleSQL
- 關於ORACLE大型事務回滾的幾個點Oracle
- 基於可靠訊息方案的分散式事務(二):Java中的事務分散式Java
- ado.net中事務的使用
- oracle分散式事務異常處理方法Oracle分散式
- oracle資料庫事務transaction 不同的鎖lock型別Oracle資料庫型別
- 事務使用中如何避免誤用分散式事務分散式
- 比較微服務中的分散式事務模式微服務分散式模式
- Spring事務專題(四)Spring中事務的使用、抽象機制及模擬Spring事務實現Spring抽象
- Oracle vs PostgreSQL,研發注意事項(2)-DDL語句與事務OracleSQL
- ORACLE事務和例項恢復過程梳理Oracle
- ORACLE懸疑分散式事務問題處理Oracle分散式
- net中的4種事務總結
- Oracle使用*的注意事項Oracle
- DTM:Golang中微服務架構的分散式事務框架Golang微服務架構分散式框架
- oracle事務隔離級別transaction isolation level初識Oracle
- 淺析MySQL事務中的redo與undoMySql