csusky

          常用鏈接

          統(tǒng)計(jì)

          最新評(píng)論

          數(shù)據(jù)庫的事務(wù) JDBC

          TRANSACTION_NONE:
            正式地講,TRANSACTION_NONE不是一個(gè)有效的事務(wù)級(jí)別。
            根據(jù)java.sql Connection API文件,這個(gè)級(jí)別表示事務(wù)是
            不被支持的,因此理論上說你不能使用TRANSACTION_NONE作
            為一個(gè)自變量賦給Connection.setTransactionIsolation()
            方法。事實(shí)上,雖然一些數(shù)據(jù)庫實(shí)施了這個(gè)事務(wù)級(jí)別,但是
            Oracle9i卻沒有實(shí)施。


           臟讀取(TRANSACTION_READ_UNCOMMITTE):
          (允許的操作       讀-讀  讀-寫 寫-讀     (臟數(shù)據(jù),不可重復(fù)讀,虛讀) )
             表示,這個(gè)事務(wù)級(jí)別
            允許讀取臟數(shù)據(jù),什么是臟數(shù)據(jù)?就是指還沒有提交的數(shù)據(jù).
            因?yàn)檫@個(gè)級(jí)別,是允許一個(gè)事務(wù)(A)讀取另一個(gè)事務(wù)(B)
            還沒有提交的數(shù)據(jù).一旦事務(wù)B發(fā)生異常退出.而修改了的數(shù)據(jù)
            卻還沒提交,或者新插入的數(shù)據(jù)和刪除了的數(shù)據(jù)都還沒有
            提交,導(dǎo)致事務(wù)A拿到了一些臟數(shù)據(jù),或者錯(cuò)誤數(shù)據(jù);
            因此在這個(gè)事務(wù)級(jí)別里是會(huì)發(fā)生臟讀,重復(fù)讀,錯(cuò)誤讀取;

           禁止臟讀(TRANSACTION_READ_COMMITTED):
          (允許的操作       讀-讀  讀-寫 (不可重復(fù)讀,虛讀))
            在這個(gè)級(jí)別中,事務(wù)A
            只能讀取一些提交的數(shù)據(jù),如事務(wù)B添加了一條記錄,但是
            如果事務(wù)B沒有提交,那么事務(wù)A是讀不到的,所以該事務(wù)級(jí)別,
            把臟讀給屏蔽掉了.---卻允許重復(fù)讀取,和錯(cuò)誤讀取.

            什么是重復(fù)讀取呢?譬如,事務(wù)A讀取了一個(gè)數(shù)據(jù),這個(gè)數(shù)據(jù)
            的值為"helloworld",事務(wù)A準(zhǔn)備利用這個(gè)數(shù)據(jù)來更新一下
            其他數(shù)據(jù),但這個(gè)時(shí)候事務(wù)B開始對(duì)這個(gè)數(shù)據(jù)進(jìn)行修改,并且
            提交---"hello 無名氏",由于是已經(jīng)提交了,所以事務(wù)A是可以
            看到這個(gè)數(shù)據(jù)的,當(dāng)事務(wù)A在沒提交事務(wù)之前,它想看下數(shù)據(jù)
            是否正確,這個(gè)時(shí)候它發(fā)現(xiàn),新讀出的數(shù)據(jù)已經(jīng)和原來的數(shù)據(jù)
            不一樣了(這就是重復(fù)讀取);




           允許重復(fù)讀取(TRANSACTION_REPEATABLE_READ):
          (允許的操作       讀-讀  讀-寫(僅允許插入,不允許刪除和修改)(虛讀))
            在這個(gè)級(jí)別中,
            是禁止了臟讀,和取消了不可重復(fù)讀取,但是沒有禁止錯(cuò)誤讀取;
            這個(gè)級(jí)別的事務(wù)比較嚴(yán)格,當(dāng)一個(gè)事務(wù)A在讀取一個(gè)值的時(shí)候
            是不允許另一個(gè)事務(wù)對(duì)該值進(jìn)行修改的;
            為了允許重復(fù)讀取,可以選用該級(jí)別,因?yàn)門RANSACTION_READ_
            COMMITED這個(gè)事務(wù)級(jí)別,是允許重復(fù)讀取提交的數(shù)據(jù)的,如果
            事務(wù)A在讀取一個(gè)數(shù)值的時(shí)候,值為"Hello World!",但這個(gè)時(shí)
            候事務(wù)B對(duì)"Hello World"值進(jìn)行修改了,改為"Hello EveryOne"
            然后提交,當(dāng)事務(wù)A再次去讀取這個(gè)值的時(shí)候,去發(fā)現(xiàn)原來讀到
            的值改變了,變成了"Hello EveryOne",為了防止出現(xiàn)這種情況
            可以禁止重復(fù)提交,目的是為了重復(fù)讀取不會(huì)出錯(cuò)!那么這個(gè)
            時(shí)候就可以選擇
          TRANSACTION_REPEATABLE_READ這個(gè)級(jí)別,
            這個(gè)級(jí)別就是用來禁止重復(fù)提交的.
          (實(shí)際上是加了行鎖,鎖定了選中的數(shù)據(jù),不允許修改,但是允許插入新的數(shù)據(jù))
            雖然這個(gè)時(shí)候是禁止了重復(fù)提交,但卻可以添加刪除,
            比如事務(wù)A,作了個(gè)查詢語句"select * from 無名氏 "; 這個(gè)時(shí)候是允許事務(wù)B做這樣的操作的:
            "insert into 無名氏 values(2,'aaa')"; 這個(gè)時(shí)候,
            事務(wù)A再次做讀取操作的時(shí)候,卻發(fā)現(xiàn)數(shù)據(jù)莫名其妙的
            多了一條,這就是所謂的---幻影讀取;




           禁止幻讀(TRANSACTION_SERIALIZABLE):
           事務(wù)的最高級(jí)別(串行化  操作)事務(wù)級(jí)別最高,所耗費(fèi)的性能也越多.
            禁止幻讀禁止了臟讀,禁止了重復(fù)提交和幻讀.
            也就是當(dāng)事務(wù)A在按條件查詢的時(shí)候,事務(wù)A一旦沒有提
            交,任何事務(wù)都不能對(duì)事務(wù)A的資源進(jìn)行操作--- 保證
            事務(wù)A的操作真正的原子性!


           注意:在Oracle中只支持兩種級(jí)別:

            TRANSACTION_READ_COMMITTED(默認(rèn)的級(jí)別)(只有提交后
               才可以讀取)而每一個(gè)終端進(jìn)行自己的DML操作 都自動(dòng)開啟了一個(gè)事務(wù)

            TRANSACTION_SERIALIZABLE(竄行化操作)

          posted on 2008-03-05 09:34 曉宇 閱讀(328) 評(píng)論(0)  編輯  收藏 所屬分類: JAVA基礎(chǔ)

          主站蜘蛛池模板: 福海县| 泰州市| 株洲市| 宁南县| 西丰县| 修文县| 湟中县| 渝北区| 津市市| 车致| 商河县| 荣昌县| 潜江市| 嘉义县| 区。| 信丰县| 新巴尔虎左旗| 潜山县| 杭锦后旗| 青浦区| 曲水县| 江孜县| 通山县| 乐清市| 岳西县| 宁河县| 合作市| 阿合奇县| 洪江市| 彭水| 福州市| 定襄县| 宝丰县| 蒙自县| 油尖旺区| 遂宁市| 宜州市| 太保市| 乌鲁木齐县| 亳州市| 海安县|