Oracle使用(八) 事務(wù)_數(shù)據(jù)類型

  1. 事務(wù)的定義:事務(wù)是一個操作序列。要么同時成功要么同時失敗,這一系列操作,是不可分割的工作單位

  2. 事務(wù)保證數(shù)據(jù)庫的完整性

  3. 事務(wù)不能嵌套
    4.在oracle中,沒有事務(wù)開始的語句。一個Transaction起始于一條DML(Insert、Update和Delete )語句,結(jié)束于以下的幾種情況:

  1. 用戶顯式執(zhí)行Commit語句提交操作或Rollback語句回退。
  2. 當(dāng)執(zhí)行DDL(Create、Alter、Drop)語句事務(wù)自動提交。執(zhí)行一個 DDL ,dcl語句或從 SQL*Plus正常退出,都會自動執(zhí)行commit命令
    3)用戶正常斷開連接時,Transaction自動提交。
    4)系統(tǒng)崩潰或斷電時事務(wù)自動回退。
  1. commit:表示事務(wù)成功的結(jié)束
  2. rollback:表示事務(wù)不成功的結(jié)束
  3. commit成功后,無法rollback

-- save point 保存點
-- 一個操作序列中包含多條sql語句,但只想部分成功,其他失敗
select * from emp;
--保存點sp之前delete操作成功,sp之后回滾
delete from emp where empno = 1234;
delete from emp where empno = 1111;
savepoint sp;
delete from emp where empno = 3;
rollback to sp;
commit;

事務(wù)的四個特性:ACID

  1. A(atomicity)原子性:強(qiáng)調(diào)不可分割

  2. C(Consistency)一致性:事務(wù)開始的前后,隨著狀態(tài)轉(zhuǎn)移,始終保證正確,比如A向B轉(zhuǎn)賬,不可能A扣了錢,B卻沒收到
    數(shù)據(jù)不一致的3種情況(事務(wù)的并發(fā)問題):
    1)臟讀
    2)不可重復(fù)讀
    4)幻讀

  3. I(Isolation)隔離性: 事務(wù)不受干擾的特點,也就是事務(wù)沒執(zhí)行完,數(shù)據(jù)不受系統(tǒng)其他部分影響,比如A正在從一張銀行卡中取錢,在A取錢的過程結(jié)束前,B不能向這張卡轉(zhuǎn)賬。
    涉及到事務(wù)4種隔離級別的概念(3讀一序列化):
    1)讀未提交(read-uncommitted)
    2)讀已提交(read-commited)
    3)可重復(fù)讀 (repeatable-read)
    4)序列化 (serializable)
    隔離級別越嚴(yán)格執(zhí)行效率越低,所以根據(jù)需要設(shè)置不同隔離級別,并不是越嚴(yán)格越好

  4. D(Durability)持久性:事務(wù)執(zhí)行完成后,會持久化至物理設(shè)備
    數(shù)據(jù)庫的特性都是為了保證數(shù)據(jù)的一致性

數(shù)據(jù)庫鎖機(jī)制:
為了解決數(shù)據(jù)庫并發(fā)訪問導(dǎo)致數(shù)據(jù)不一致的問題,就需要給數(shù)據(jù)庫加鎖,為了執(zhí)行效率,注意選擇鎖的粒度:
1)鎖庫
2)鎖表
3)鎖行
粒度越大效率越低,實際開發(fā)中大部分是行級鎖

為什么不用oracle,因為oracle
mysql事務(wù)測試:

  1. 將自動提交事務(wù)關(guān)閉
    --首先查看事務(wù)是否是自動提交(默認(rèn)是自動提交)
    select @@autocommit;


    image.png

    --改為不自動提交
    set autocommit = 0;

  2. 準(zhǔn)備數(shù)據(jù)
    --建庫
    create database tran;
    --使用庫
    use tran;
    --建表
    create table psn(id int primary key,name varchar(10)) engine = innodb;
    insert into psn values(1,'zhangsan');
    insert into psn values(2,'lisi');
    insert into psn values(3,'wangwu');
    commit;

  3. 事務(wù)隔離級別
    讀未提交:AB事務(wù)并發(fā)訪問數(shù)據(jù),B事務(wù)讀到A未提交的事務(wù)數(shù)據(jù),也就是出現(xiàn)臟讀
    讀已提交:AB事務(wù)并發(fā)訪問數(shù)據(jù),A修改數(shù)據(jù),但未commit,B事務(wù)此時讀取不到A未提交數(shù)據(jù),當(dāng)A提交事務(wù)后,B事務(wù)再次讀取,發(fā)現(xiàn)兩次結(jié)果不一致,也就是出現(xiàn)不可重復(fù)讀
    可重復(fù)讀:AB事務(wù)并發(fā)訪問數(shù)據(jù),不論A怎么修改數(shù)據(jù),事務(wù)是否提交,B事務(wù)每次讀取結(jié)果都一致。會出現(xiàn)數(shù)據(jù)庫已被A更新,事務(wù)B卻讀不到,也就是會出現(xiàn)幻讀
    序列化:串行執(zhí)行 臟讀、不可重復(fù)讀、幻讀都不會出現(xiàn)

四種隔離級別產(chǎn)生數(shù)據(jù)不一致的3種現(xiàn)象:
臟讀
不可重復(fù)讀
幻讀

--設(shè)置事務(wù)隔離級別為讀未提交(兩個窗口都要執(zhí)行)
set session transaction isolation level read uncommitted;


image.png
  1. 測試事務(wù)
    注意每次切換事務(wù)隔離級別之前先確保事務(wù)都commit了,表示事務(wù)結(jié)束,重置了上下文
    窗口A: start transaction;
    窗口B: start transaction;

  2. 讀未提交產(chǎn)生臟讀的現(xiàn)象
    --窗口A更新數(shù)據(jù)但沒commit:


    image.png

--窗口B卻能查到,出現(xiàn)了臟讀:


image.png

將A窗口數(shù)據(jù)回滾


image.png

此時B窗口數(shù)據(jù)同A窗口

  1. 讀已提交,不會出現(xiàn)臟讀了
    首先將兩窗口都設(shè)置事務(wù)隔離級別為讀已提交并start transaction


    image.png

A窗口執(zhí)行更新,但沒有commit:


image.png

B窗口執(zhí)行:


image.png

發(fā)現(xiàn)已經(jīng)不會臟讀,但是出現(xiàn)了不可重復(fù)讀

A窗口commit結(jié)束事務(wù):


image.png

B窗口再次查詢發(fā)現(xiàn)又變成zhangsan了:


image.png

在B窗口同一個事務(wù)中,兩次讀取不一致,出現(xiàn)了不可重復(fù)讀

  1. 可重復(fù)讀
    將AB兩窗口分別執(zhí)行:


    image.png

--查詢當(dāng)前會話的事務(wù)隔離級別
select @@tx_isolation;
--查詢數(shù)據(jù)庫系統(tǒng)的事務(wù)隔離級別
select @@global.tx_isolation;
A窗口修改記錄:


image.png

A提交事務(wù):


image.png

B窗口查詢記錄:
第一次A剛修改完記錄,B查詢一次,第二次A commit事務(wù),B再查一次


image.png

可見B窗口同一個事務(wù)中,兩次查詢結(jié)果一致,消除了不可重讀的現(xiàn)象,實際上數(shù)據(jù)庫中已經(jīng)是A提交事務(wù)后的數(shù)據(jù),B的第二次查詢卻沒有讀出來

在AB會話事務(wù)隔離級別為repeatable read情況下:
A窗口向數(shù)據(jù)庫中插入一條記錄:


image.png

B會話在A插入之前查詢一次,插入之后再查詢一次,都顯示如下結(jié)果:


image.png

然后B會話執(zhí)行插入同樣一條記錄:

image.png

B會話在同一事務(wù)中,查詢的時候沒有該條記錄,插入時出現(xiàn)了提示重復(fù)主鍵,出現(xiàn)幻讀,刪除也是如此,如果隔離級別為串行化,則不會出現(xiàn)
幻讀只會在插入和刪除記錄會出現(xiàn),查詢在repeatable read隔離級別下,不可能出現(xiàn)幻讀

數(shù)據(jù)庫級別的事務(wù)隔離級別以及會出現(xiàn)的數(shù)據(jù)不一致的現(xiàn)象總結(jié):

image.png

Oracle數(shù)據(jù)類型:
1). number(x,y) 數(shù)字類型 ,最長x位,y位小數(shù)

2). varchar2(maxlength):變長字符串,這個參數(shù)的上限是32767字節(jié)
? 聲明方式如下VARCHAR2(L),L為字符串長度,沒有缺省值,作為變量最大32767個字節(jié)

3). char(max_length) :定長字符串 最大2000字節(jié)

4). DATE:日期類型 (只能精確到秒。)

5). TIMESTAMP:時間戳 (精確到微秒)
6). long:長字符串,最長2GB

了解類型
① CLOB:最大長度4G -->大對象很少使用:如果存在大對象,一般的解決方案存入文件地址
(地址為程序所在應(yīng)用服務(wù)器的相對路徑)。
② BLOB:存二進(jìn)制文件

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容