標籤:行記錄 情況下 開啟 microsoft 支援 行業 資料不一致 定義 sel
DTL
資料事務語言
事務的定義:
就是指一組相關的SQL操作,我們所有的操作都是事務中的。
注意:在資料庫中,執行業務的基本單位是【事務】,不是以某一條SQL。
資料庫在預設情況下,事務是都開啟的,也就是說它一種處在事務當中的,一個事務的結束,代表著下一個事務的開啟。
執行commit或者rollback指令時,會結束當前事務
作用:用來保證資料的平穩性和可預測性
例如:銀行轉賬業務
【SQL1:A帳號向B帳號轉賬10000
update tbl_account set balance=balance-10000 where accountNo=A帳號;
SQL2:
update tbl_account set balance=balance+10000 where accountNo=B帳號;
SQL1和SQL2必須處在同一個事務中,從而保證同時成功或者同時失敗。】
事務的四大特性(ACID):
atomic,原子性,事務是不可分割的,要麼同時成功,要麼同時失敗;
consistency,一致性,事務一旦結束,記憶體中的資料和資料庫中的資料是保持一致;
isolation,隔離性,事務之間互不干擾,一個事務的結束意味著下一個事務的開啟;
duration,持久性,事務一旦提交,則資料持久化到資料庫中,永久儲存
在oracle中,操作事務的命令:
1.commit,提交事務
把事務中所有的資料持久化到磁碟中
2.rollback to 復原點,復原事務
把事務中所做的操作全部取消,回到初始化狀態
3.savepoint 復原點,設定復原點
交易回復時,復原到起點
總結:
1.目前主流的資料庫都是支援事務的,而且其中Oracle支援的最好
2.一個事務不能讀取到另一個事務還沒有提交的資料
3.DDL語句都會自動認可事務
4.DML語句不會自動認可事務,需要手動提交commit
多事務的並發處理機制:
原因:多個事務同時操作一個表中的同一行資料,如果這些操作同時修改的話,就會產生並發問題,如果不處理,則會造成資料的不一致的情況
資料庫可能產生的並發問題包括:
1.髒讀
是指一個事務正在訪問資料,並且對這個資料進行修改,而這種修改還沒有提交到資料庫中,而另一個事務也訪問了這個資料,並且使用了這個資料。
解決方案:一個事務在修改資料時,該資料不能被其他事務訪問
2.不可重複讀取:
是指一個事務多次讀取同一條記錄,如果此時另一個事務也訪問並且修改了該資料,則就會出現多次讀取出現資料不一致的情況,原來的資料變成了不可重複讀取的資料。
解決方案:只有在修改事務完全提交過後才可以讀取資料
3.幻讀
是指一個事務修改表中的多行記錄,但是此時另一個事務對該表格進行了插入資料的操作,則第一個事務會發現表格中會出現沒有被修改的行,就像發生了幻象一樣;
解決方案:在一個事務提交資料之前,其他事務不能添加資料
【Oracle中採用‘鎖’來做並發處理】
1.表級排它鎖(X)exclusive mode
2.表級共用鎖定(S)share mode
3.表中行級排它鎖share row exclusive
註:這三種鎖是通過專門的命令來申請的
文法:
lock table tbl_name in mode;
例如:
--以共用鎖定鎖表
lock table tbl_emp in share mode;
--以排它鎖鎖表
lock table tbl_emp in exlusive mdoe;
4.行級共用鎖定(RS)row share
5.行級排它鎖(RX)row exclusive
註:這兩種鎖無需通過專門的命令申請,而是通過DQL和DML來自動申請的
注意:
1.所有的DQL語句預設情況下都會自動申請RS鎖
2.所有的DML語句預設情況下都會自動申請RX鎖,每一行記錄都有唯一的RX鎖
3.在項目中,為了滿足業務要求,一般select語句需要申請RX鎖
select語句通過for update來申請RX鎖:
select * from s_emp for update;
select * from s_emp for update wait 5;等待5秒
select * from s_emp for update nowait;
Oracle DTL 資料事務語言