程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle教程 >> Oracle基礎(七):數據庫事務

Oracle基礎(七):數據庫事務

編輯:Oracle教程

Oracle基礎(七):數據庫事務


一、基本概念 1、事務(Transaction):是並發控制的基本單位。所謂的事務,它是一個操作序列,這些操作要麼都執行,要麼都不執行,它是一個不可分割的工作單位。例如,銀行轉賬工作:從一個賬號扣款並使另一個賬號增款,這兩個操作要麼都執行,要麼都不執行。所以,應該把它們看成一個事務。事務是數據庫維護數據一致性的單位,在每個事務結束時,都能保持數據一致性。
2、事務與鎖 當執行事務操作時,oracle會在被作用的表上家鎖,防止其他用戶改表的結構。
3、事務的操作過程 1)事務的開始(默認自動開始):setAutoCommit(false) 2)設置保存點:savepoint pointAA
可以設置多個保存點
一旦回退以後,不能再次回退。 3)回滾到保存點(提交後無法回滾):rollback to pointAA; 4)事務提交:commit
2、事務具有以下4個基本特征。
Atomic(原子性):事務中包含的操作被看做一個邏輯單元,這個邏輯單元中的操作要麼全部成功,要麼全部失敗。
Consistency(一致性):只有合法的數據可以被寫入數據庫,否則事務應該將其回滾到最初狀態。
Isolation(隔離性):事務允許多個用戶對同一個數據進行並發訪問,而不破壞數據的正確性和完整性。同時,並行事務的修改必須與其他並行事務的修改相互獨立。
Durability(持久性):事務結束後,事務處理的結果必須能夠得到固化。 3、事務的語句
開始事物:BEGIN TRANSACTION
提交事物:COMMIT TRANSACTION
回滾事務:ROLLBACK TRANSACTION 4、事務的保存點 SAVEPOINT pointName 保存點名稱 --自定義保存點的名稱和位置 ROLLBACK TO pointName 保存點名稱 --回滾到自定義的保存點
二、事務隔離級別(isolation )
(一)標准事務隔離級別 1、READ UNCOMMITTED:讀未提交
發生髒讀 2、READ COMMITTED:讀已提交
在trasaction A中讀取數據時對記錄添加共享鎖,但讀取結束立即釋放。其它transaction B對這個記錄的試圖修改會一直等待直到A中的讀取過程結束,而不需要整個trasaction A的結束。所以,在trasaction A的不同階段對同一記錄的讀取結果可能是不同的。
可能發生的問題:不可重復讀。 3、REPEATABLE READ:可重復讀
對於讀出的記錄,添加共享鎖直到transaction A結束。其它transaction B對這個記錄的試圖修改會一直等待直到trasaction A結束。
可能發生的問題:當執行一個范圍查詢時,可能會發生幻讀。 4、SERIALIZABLE:序列化
添加范圍鎖(比如表鎖,頁鎖等),直到transaction A結束。以此阻止其它trasaction B對此范圍內的insert,update等操作。
幻讀,髒讀,不可重復讀等問題都不會發生。 \

(二)事務的問題 1、髒讀
當一個事務 A 讀取另一個事務B 尚未提交的修改時,產生髒讀。 2、不可重復讀
同一查詢在同一事務 A 中多次進行,由於其他提交事務 B 所做的修改或者刪除,每次返回不同的結果集,此時發生非重復讀。 3、幻讀
同一查詢在同一事務 A 中多次進行,由於其他提交事務 B 所做的插入操作,每次返回不同的結果集,此時發生幻讀。 (三)Oracle的隔離劑別 1、SQL92標准的 1)READ COMMITTED:讀已提交
這是oracle 默認的事務隔離機制
保證不會髒讀,單可能出現非重復讀和幻讀。 2)SERIALIZABLE:序列化
提供了事務看起來像隊列一樣一個一個順序執行。
僅僅能看到在本事務開始前由其他事務提交的更改和在本事務中所做的更改。
保證不會出現髒讀、不可重復讀和幻讀
serializable:提供了read-only 事務所提供的讀一致性,同時又允許DML(update\insert\delete)操作 2、非SQL92標准:read-only
保證不會出現髒讀、不可重復讀和幻讀
只能讀,不能操作DML(update\insert\delete)操作。
(四)設置Oracle的隔離劑別 1、設置一個事務的隔離級別
set transcation isolation level read committed;
set transcation isolation level serializable;
set transcation read-only; 2、設置整個會話的隔離級別
alter session set isolation_level read committed;
alter session set isolation_level serializable;

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved