1、原子性(Atomicity)
事務的原子性是指事務中包含的所有操作要么都做,要么都不做,保證數據庫是一致的。
例如:A帳戶向B帳戶劃賬1000,則先將A減少1000,再將B增加1000,這兩個動作要么都提交,要么都回退,不可能發生一個有效、一個無效的情況。
2、一致性(Consistency)
一致性是指數據庫在事務操作前和事務處理后,其中的數據必須都滿足業務規則約束。
例如:A、B帳戶的總金額在轉賬前和轉帳后必須一致,其中的不一致必須是短暫的,在事務提交前才會出現的。
再如:約定B帳戶不能多于1000元,則A轉出1000成功,B轉入1000失敗,最終由原子性得到——整個事務回滾
3、隔離性(Isolation)
隔離性是數據庫允許多個并發事務同時對齊數據進行讀寫和修改的能力,隔離性可以防止多個事務并發執行時由于交叉執行而導致數據的不一致。
例如:在A、B之間轉帳時,C同時向A轉帳,若同時進行則A、B之間的一致性不能得到滿足。所以在A、B事務執行過程中,其他事務不能訪問(修改)當前相關的數值。
4、持久性(Durability)
持久性表示為:事務處理結束后,對數據的修改就是永久的,即便系統故障也不會丟失。
在提交之前如果系統故障,則所有信息全部丟失。提交之后數據存放在磁盤中,是永久性的。
事務的控制
事務的開始是隱形聲明的,不用也沒有語句可以進行操作,默認從對數據的修改開始就開始了當前事務。
對數據庫的設置主要有一下語句:
SET TRANSACTION-----設置事務屬性
SET CONSTRANS-------設置約束模式
SAVEPOINT-----------建立存儲點
RELEASE SAVEPOINT---釋放存儲點
ROLLBACK------------回滾
COMMIT--------------提交
1、設置事務屬性
設置事務屬性主要可以用來完成以下工作:
* 指定事務的隔離層
* 規定回滾事務時所使用的存儲空間
* 命名事務
注:SET TRANSACTION必須是事務的第一個語句。并在事務終止后自動失效。
SET TRANSACTION ISOLATION LEVEL READ COMMITED
A事務設置為READ COMMITED,該開始后B事務修改了數據,此時A無法得到新數據,B提交之后,A可以查詢到更新數據。 A不可能錯讀,但可能發生假讀和非重復讀。
在需要并發數很大時應該使用READ COMMITED,對于多用戶并發的性能和響應速度都比較好。
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
事務和事務之間完全隔離開,事務以串行的方式執行。不是說必須等一個結束,而是事務一旦開始,在結束之前查詢到的數據永遠是開始時刻的數據。由于留存的模式會比較多,所以會消耗一定的系統資源。
SET TRANSACTION READ ONLY
當前事務不能有任何修改數據的操作,READ ONLY是SERIALIZABLE的一個子集,基本上屬于最高的安全級。
SET TRANSACTION READ WRITE
在READ的基礎上增加WRITE權限,不常用
2、設置約束延期性
在操作過程中可能需要違反約束向表中插入重復的數據,其實需要設置約束延期性。
設置格式如下:
SET CONSTRAINT ALL | <constraint_name>
DEFERRED | IMMEDIATE
可以選擇要延期的約束名,也可以使用ALL關鍵字延期所有的約束
DEFERRED表示延期,IMMEDIATE表示應用
注:理論上在COMMIT前需要設置回IMMEDIATE,但是系統可以隱式自動完成這一操作。
注意:要使用延遲的約束,必須在創建時就進行說明:
ALTER TABLE T1 ADD CONSTRAINT <constraint_name> DEFERRABLE INITIALLY IMMEDIATE
后面的DEFERRABLE 指名可以使用延遲,INITIALLY 設定了初始值
3、存儲點
由于事務太大,一次回滾會對系統造成很大的壓力。而且有時候在某一段特定的代碼附近會特別發生錯誤而回滾。這時就需要在希望的地方設置一個存儲點,可以顯示得操作數據在發生錯誤時回滾到指定的存儲點,而節省不必要的開銷。
創建格式如下:
SAVEPOINT <savepoint_name>
使用格式如下:
ROLLBACK TO [SAVEPOINT] <savepoint_name>
4、結束事務
以下操作為將事務結束:
* 使用COMMIT提交事務,數據被永久保存
* 使用ROLLBACK回滾事務(不包括回滾到存儲點)
* 執行DDL時,結束默認COMMIT
* 用戶斷開連接,此時事務自動COMMIT
* 進程意外中止,此時事務自動ROLLBACK
注:事務COMMIT時會生成一個唯一的系統變化號(SCN)保存到事務表