<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    學(xué)習(xí)園地

    BlogJava 首頁 新隨筆 聯(lián)系 聚合 管理
      3 Posts :: 14 Stories :: 0 Comments :: 0 Trackbacks

    一、Propagation (事務(wù)的傳播屬性)

    Propagation :  key屬性確定代理應(yīng)該給哪個(gè)方法增加事務(wù)行為。這樣的屬性最重要的部份是傳播行為。有以下選項(xiàng)可供使用:  

    PROPAGATION_REQUIRED--支持當(dāng)前事務(wù),如果當(dāng)前沒有事務(wù),就新建一個(gè)事務(wù)。這是最常見的選擇。

    PROPAGATION_SUPPORTS--支持當(dāng)前事務(wù),如果當(dāng)前沒有事務(wù),就以非事務(wù)方式執(zhí)行。

    PROPAGATION_MANDATORY--支持當(dāng)前事務(wù),如果當(dāng)前沒有事務(wù),就拋出異常。

    PROPAGATION_REQUIRES_NEW--新建事務(wù),如果當(dāng)前存在事務(wù),把當(dāng)前事務(wù)掛起。

    PROPAGATION_NOT_SUPPORTED--以非事務(wù)方式執(zhí)行操作,如果當(dāng)前存在事務(wù),就把當(dāng)前事務(wù)掛起。

    PROPAGATION_NEVER--以非事務(wù)方式執(zhí)行,如果當(dāng)前存在事務(wù),則拋出異常。

    1: PROPAGATION_REQUIRED

    加入當(dāng)前正要執(zhí)行的事務(wù)不在另外一個(gè)事務(wù)里,那么就起一個(gè)新的事務(wù)

    比如說,ServiceB.methodB的事務(wù)級(jí)別定義為PROPAGATION_REQUIRED, 那么由于執(zhí)行ServiceA.methodA的時(shí)候,

    ServiceA.methodA已經(jīng)起了事務(wù),這時(shí)調(diào)用ServiceB.methodB,ServiceB.methodB看到自己已經(jīng)運(yùn)行在ServiceA.methodA

    的事務(wù)內(nèi)部,就不再起新的事務(wù)。而假如ServiceA.methodA運(yùn)行的時(shí)候發(fā)現(xiàn)自己沒有在事務(wù)中,他就會(huì)為自己分配一個(gè)事務(wù)。

    這樣,在ServiceA.methodA或者在ServiceB.methodB內(nèi)的任何地方出現(xiàn)異常,事務(wù)都會(huì)被回滾。即使ServiceB.methodB的事務(wù)已經(jīng)被

    提交,但是ServiceA.methodA在接下來fail要回滾,ServiceB.methodB也要回滾

    2: PROPAGATION_SUPPORTS

    如果當(dāng)前在事務(wù)中,即以事務(wù)的形式運(yùn)行,如果當(dāng)前不再一個(gè)事務(wù)中,那么就以非事務(wù)的形式運(yùn)行

    3: PROPAGATION_MANDATORY

    必須在一個(gè)事務(wù)中運(yùn)行。也就是說,他只能被一個(gè)父事務(wù)調(diào)用。否則,他就要拋出異常

    4: PROPAGATION_REQUIRES_NEW

    這個(gè)就比較繞口了。 比如我們?cè)O(shè)計(jì)ServiceA.methodA的事務(wù)級(jí)別為PROPAGATION_REQUIRED,ServiceB.methodB的事務(wù)級(jí)別為PROPAGATION_REQUIRES_NEW,

    那么當(dāng)執(zhí)行到ServiceB.methodB的時(shí)候,ServiceA.methodA所在的事務(wù)就會(huì)掛起,ServiceB.methodB會(huì)起一個(gè)新的事務(wù),等待ServiceB.methodB的事務(wù)完成以后,

    他才繼續(xù)執(zhí)行。他與PROPAGATION_REQUIRED 的事務(wù)區(qū)別在于事務(wù)的回滾程度了。因?yàn)镾erviceB.methodB是新起一個(gè)事務(wù),那么就是存在

    兩個(gè)不同的事務(wù)。如果ServiceB.methodB已經(jīng)提交,那么ServiceA.methodA失敗回滾,ServiceB.methodB是不會(huì)回滾的。如果ServiceB.methodB失敗回滾,

    如果他拋出的異常被ServiceA.methodA捕獲,ServiceA.methodA事務(wù)仍然可能提交。

    5: PROPAGATION_NOT_SUPPORTED

    當(dāng)前不支持事務(wù)。比如ServiceA.methodA的事務(wù)級(jí)別是PROPAGATION_REQUIRED ,而ServiceB.methodB的事務(wù)級(jí)別是PROPAGATION_NOT_SUPPORTED ,

    那么當(dāng)執(zhí)行到ServiceB.methodB時(shí),ServiceA.methodA的事務(wù)掛起,而他以非事務(wù)的狀態(tài)運(yùn)行完,再繼續(xù)ServiceA.methodA的事務(wù)。

    6: PROPAGATION_NEVER

    不能在事務(wù)中運(yùn)行。假設(shè)ServiceA.methodA的事務(wù)級(jí)別是PROPAGATION_REQUIRED, 而ServiceB.methodB的事務(wù)級(jí)別是PROPAGATION_NEVER ,

    那么ServiceB.methodB就要拋出異常了。

    7: PROPAGATION_NESTED

    理解Nested的關(guān)鍵是savepoint。他與PROPAGATION_REQUIRES_NEW的區(qū)別是,PROPAGATION_REQUIRES_NEW另起一個(gè)事務(wù),將會(huì)與他的父事務(wù)相互獨(dú)立,

    而Nested的事務(wù)和他的父事務(wù)是相依的,他的提交是要等和他的父事務(wù)一塊提交的。也就是說,如果父事務(wù)最后回滾,他也要回滾的。

    而Nested事務(wù)的好處是他有一個(gè)savepoint。

    *****************************************

    ServiceA {

    /**

    * 事務(wù)屬性配置為 PROPAGATION_REQUIRED

    */

    void methodA() {

    try {

    //savepoint

    ServiceB.methodB(); //PROPAGATION_NESTED 級(jí)別

    } catch (SomeException) {

    // 執(zhí)行其他業(yè)務(wù), 如 ServiceC.methodC();

    }

    }

    }

    ********************************************

    也就是說ServiceB.methodB失敗回滾,那么ServiceA.methodA也會(huì)回滾到savepoint點(diǎn)上,ServiceA.methodA可以選擇另外一個(gè)分支,比如

    ServiceC.methodC,繼續(xù)執(zhí)行,來嘗試完成自己的事務(wù)。

    但是這個(gè)事務(wù)并沒有在EJB標(biāo)準(zhǔn)中定義。

    二、Isolation Level(事務(wù)隔離等級(jí)):

    1、Serializable:最嚴(yán)格的級(jí)別,事務(wù)串行執(zhí)行,資源消耗最大;

    2、REPEATABLE READ:保證了一個(gè)事務(wù)不會(huì)修改已經(jīng)由另一個(gè)事務(wù)讀取但未提交(回滾)的數(shù)據(jù)。避免了“臟讀取”和“不可重復(fù)讀取”的情況,但是帶來了更多的性能損失。

    3、READ COMMITTED:大多數(shù)主流數(shù)據(jù)庫的默認(rèn)事務(wù)等級(jí),保證了一個(gè)事務(wù)不會(huì)讀到另一個(gè)并行事務(wù)已修改但未提交的數(shù)據(jù),避免了“臟讀取”。該級(jí)別適用于大多數(shù)系統(tǒng)。

    4、Read Uncommitted:保證了讀取過程中不會(huì)讀取到非法數(shù)據(jù)。隔離級(jí)別在于處理多事務(wù)的并發(fā)問題。

    我們知道并行可以提高數(shù)據(jù)庫的吞吐量和效率,但是并不是所有的并發(fā)事務(wù)都可以并發(fā)運(yùn)行,這需要查看數(shù)據(jù)庫教材的可串行化條件判斷了。

    這里就不闡述。

    我們首先說并發(fā)中可能發(fā)生的3中不討人喜歡的事情

    1: Dirty reads--讀臟數(shù)據(jù)。也就是說,比如事務(wù)A的未提交(還依然緩存)的數(shù)據(jù)被事務(wù)B讀走,如果事務(wù)A失敗回滾,會(huì)導(dǎo)致事務(wù)B所讀取的的數(shù)據(jù)是錯(cuò)誤的。

    2: non-repeatable reads--數(shù)據(jù)不可重復(fù)讀。比如事務(wù)A中兩處讀取數(shù)據(jù)-total-的值。在第一讀的時(shí)候,total是100,然后事務(wù)B就把total的數(shù)據(jù)改成 200,事務(wù)A再讀一次,結(jié)果就發(fā)現(xiàn),total竟然就變成200了,造成事務(wù)A數(shù)據(jù)混亂。

    3: phantom reads--幻象讀數(shù)據(jù),這個(gè)和non-repeatable reads相似,也是同一個(gè)事務(wù)中多次讀不一致的問題。但是non-repeatable reads的不一致是因?yàn)樗〉臄?shù)據(jù)集被改變了(比如total的數(shù)據(jù)),但是phantom reads所要讀的數(shù)據(jù)的不一致卻不是他所要讀的數(shù)據(jù)集改變,而是他的條件數(shù)據(jù)集改變。比如Select account.id where account.name="ppgogo*",第一次讀去了6個(gè)符合條件的id,第二次讀取的時(shí)候,由于事務(wù)b把一個(gè)帳號(hào)的名字由"dd"改成"ppgogo1",結(jié)果取出來了7個(gè)數(shù)據(jù)。

     

      Dirty reads non-repeatable reads phantom reads
    Serializable 不會(huì) 不會(huì) 不會(huì)
    REPEATABLE READ 不會(huì) 不會(huì) 會(huì)
    READ COMMITTED 不會(huì) 會(huì) 會(huì)
    Read Uncommitted 會(huì) 會(huì) 會(huì)

     

     

    三、readOnly

    事務(wù)屬性中的readOnly標(biāo)志表示對(duì)應(yīng)的事務(wù)應(yīng)該被最優(yōu)化為只讀事務(wù)。

    這是一個(gè)最優(yōu)化提示。在一些情況下,一些事務(wù)策略能夠起到顯著的最優(yōu)化效果,例如在使用Object/Relational映射工具(如:Hibernate或TopLink)時(shí)避免dirty checking(試圖“刷新”)。

    四、Timeout

    在事務(wù)屬性中還有定義“timeout”值的選項(xiàng),指定事務(wù)超時(shí)為幾秒。在JTA中,這將被簡(jiǎn)單地傳遞到J2EE服務(wù)器的事務(wù)協(xié)調(diào)程序,并據(jù)此得到相應(yīng)的解釋

     

    spring里面事務(wù)的傳播屬性和事務(wù)隔離級(jí)別

     

    一、Propagation (事務(wù)的傳播屬性)

    Propagation :  key屬性確定代理應(yīng)該給哪個(gè)方法增加事務(wù)行為。這樣的屬性最重要的部份是傳播行為。有以下選項(xiàng)可供使用:PROPAGATION_REQUIRED--支持當(dāng)前事務(wù),如果當(dāng)前沒有事務(wù),就新建一個(gè)事務(wù)。這是最常見的選擇。

    PROPAGATION_SUPPORTS--支持當(dāng)前事務(wù),如果當(dāng)前沒有事務(wù),就以非事務(wù)方式執(zhí)行。

    PROPAGATION_MANDATORY--支持當(dāng)前事務(wù),如果當(dāng)前沒有事務(wù),就拋出異常。

    PROPAGATION_REQUIRES_NEW--新建事務(wù),如果當(dāng)前存在事務(wù),把當(dāng)前事務(wù)掛起。

    PROPAGATION_NOT_SUPPORTED--以非事務(wù)方式執(zhí)行操作,如果當(dāng)前存在事務(wù),就把當(dāng)前事務(wù)掛起。

    PROPAGATION_NEVER--以非事務(wù)方式執(zhí)行,如果當(dāng)前存在事務(wù),則拋出異常。

    1: PROPAGATION_REQUIRED

    加入當(dāng)前正要執(zhí)行的事務(wù)不在另外一個(gè)事務(wù)里,那么就起一個(gè)新的事務(wù)

    比如說,ServiceB.methodB的事務(wù)級(jí)別定義為PROPAGATION_REQUIRED, 那么由于執(zhí)行ServiceA.methodA的時(shí)候,

    ServiceA.methodA已經(jīng)起了事務(wù),這時(shí)調(diào)用ServiceB.methodB,ServiceB.methodB看到自己已經(jīng)運(yùn)行在ServiceA.methodA

    的事務(wù)內(nèi)部,就不再起新的事務(wù)。而假如ServiceA.methodA運(yùn)行的時(shí)候發(fā)現(xiàn)自己沒有在事務(wù)中,他就會(huì)為自己分配一個(gè)事務(wù)。

    這樣,在ServiceA.methodA或者在ServiceB.methodB內(nèi)的任何地方出現(xiàn)異常,事務(wù)都會(huì)被回滾。即使ServiceB.methodB的事務(wù)已經(jīng)被

    提交,但是ServiceA.methodA在接下來fail要回滾,ServiceB.methodB也要回滾

    2: PROPAGATION_SUPPORTS

    如果當(dāng)前在事務(wù)中,即以事務(wù)的形式運(yùn)行,如果當(dāng)前不再一個(gè)事務(wù)中,那么就以非事務(wù)的形式運(yùn)行

    3: PROPAGATION_MANDATORY

    必須在一個(gè)事務(wù)中運(yùn)行。也就是說,他只能被一個(gè)父事務(wù)調(diào)用。否則,他就要拋出異常

    4: PROPAGATION_REQUIRES_NEW

    這個(gè)就比較繞口了。 比如我們?cè)O(shè)計(jì)ServiceA.methodA的事務(wù)級(jí)別為PROPAGATION_REQUIRED,ServiceB.methodB的事務(wù)級(jí)別為PROPAGATION_REQUIRES_NEW,

    那么當(dāng)執(zhí)行到ServiceB.methodB的時(shí)候,ServiceA.methodA所在的事務(wù)就會(huì)掛起,ServiceB.methodB會(huì)起一個(gè)新的事務(wù),等待ServiceB.methodB的事務(wù)完成以后,

    他才繼續(xù)執(zhí)行。他與PROPAGATION_REQUIRED 的事務(wù)區(qū)別在于事務(wù)的回滾程度了。因?yàn)镾erviceB.methodB是新起一個(gè)事務(wù),那么就是存在

    兩個(gè)不同的事務(wù)。如果ServiceB.methodB已經(jīng)提交,那么ServiceA.methodA失敗回滾,ServiceB.methodB是不會(huì)回滾的。如果ServiceB.methodB失敗回滾,

    如果他拋出的異常被ServiceA.methodA捕獲,ServiceA.methodA事務(wù)仍然可能提交。

    5: PROPAGATION_NOT_SUPPORTED

    當(dāng)前不支持事務(wù)。比如ServiceA.methodA的事務(wù)級(jí)別是PROPAGATION_REQUIRED ,而ServiceB.methodB的事務(wù)級(jí)別是PROPAGATION_NOT_SUPPORTED ,

    那么當(dāng)執(zhí)行到ServiceB.methodB時(shí),ServiceA.methodA的事務(wù)掛起,而他以非事務(wù)的狀態(tài)運(yùn)行完,再繼續(xù)ServiceA.methodA的事務(wù)。

    6: PROPAGATION_NEVER

    不能在事務(wù)中運(yùn)行。假設(shè)ServiceA.methodA的事務(wù)級(jí)別是PROPAGATION_REQUIRED, 而ServiceB.methodB的事務(wù)級(jí)別是PROPAGATION_NEVER ,

    那么ServiceB.methodB就要拋出異常了。

    7: PROPAGATION_NESTED

    理解Nested的關(guān)鍵是savepoint。他與PROPAGATION_REQUIRES_NEW的區(qū)別是,PROPAGATION_REQUIRES_NEW另起一個(gè)事務(wù),將會(huì)與他的父事務(wù)相互獨(dú)立,

    而Nested的事務(wù)和他的父事務(wù)是相依的,他的提交是要等和他的父事務(wù)一塊提交的。也就是說,如果父事務(wù)最后回滾,他也要回滾的。

    而Nested事務(wù)的好處是他有一個(gè)savepoint。

    *****************************************

    ServiceA {

    /**

    * 事務(wù)屬性配置為 PROPAGATION_REQUIRED

    */

    void methodA() {

    try {

    //savepoint

    ServiceB.methodB(); //PROPAGATION_NESTED 級(jí)別

    } catch (SomeException) {

    // 執(zhí)行其他業(yè)務(wù), 如 ServiceC.methodC();

    }

    }

    }

    ********************************************

    也就是說ServiceB.methodB失敗回滾,那么ServiceA.methodA也會(huì)回滾到savepoint點(diǎn)上,ServiceA.methodA可以選擇另外一個(gè)分支,比如

    ServiceC.methodC,繼續(xù)執(zhí)行,來嘗試完成自己的事務(wù)。

    但是這個(gè)事務(wù)并沒有在EJB標(biāo)準(zhǔn)中定義。

    二、Isolation Level(事務(wù)隔離等級(jí)):

    1、Serializable:最嚴(yán)格的級(jí)別,事務(wù)串行執(zhí)行,資源消耗最大;

    2、REPEATABLE READ:保證了一個(gè)事務(wù)不會(huì)修改已經(jīng)由另一個(gè)事務(wù)讀取但未提交(回滾)的數(shù)據(jù)。避免了“臟讀取”和“不可重復(fù)讀取”的情況,但是帶來了更多的性能損失。

    3、READ COMMITTED:大多數(shù)主流數(shù)據(jù)庫的默認(rèn)事務(wù)等級(jí),保證了一個(gè)事務(wù)不會(huì)讀到另一個(gè)并行事務(wù)已修改但未提交的數(shù)據(jù),避免了“臟讀取”。該級(jí)別適用于大多數(shù)系統(tǒng)。

    4、Read Uncommitted:保證了讀取過程中不會(huì)讀取到非法數(shù)據(jù)。隔離級(jí)別在于處理多事務(wù)的并發(fā)問題。

    我們知道并行可以提高數(shù)據(jù)庫的吞吐量和效率,但是并不是所有的并發(fā)事務(wù)都可以并發(fā)運(yùn)行,這需要查看數(shù)據(jù)庫教材的可串行化條件判斷了。

    這里就不闡述。

    我們首先說并發(fā)中可能發(fā)生的3中不討人喜歡的事情

    1: Dirty reads--讀臟數(shù)據(jù)。也就是說,比如事務(wù)A的未提交(還依然緩存)的數(shù)據(jù)被事務(wù)B讀走,如果事務(wù)A失敗回滾,會(huì)導(dǎo)致事務(wù)B所讀取的的數(shù)據(jù)是錯(cuò)誤的。

    2: non-repeatable reads--數(shù)據(jù)不可重復(fù)讀。比如事務(wù)A中兩處讀取數(shù)據(jù)-total-的值。在第一讀的時(shí)候,total是100,然后事務(wù)B就把total的數(shù)據(jù)改成 200,事務(wù)A再讀一次,結(jié)果就發(fā)現(xiàn),total竟然就變成200了,造成事務(wù)A數(shù)據(jù)混亂。

    3: phantom reads--幻象讀數(shù)據(jù),這個(gè)和non-repeatable reads相似,也是同一個(gè)事務(wù)中多次讀不一致的問題。但是non-repeatable reads的不一致是因?yàn)樗〉臄?shù)據(jù)集被改變了(比如total的數(shù)據(jù)),但是phantom reads所要讀的數(shù)據(jù)的不一致卻不是他所要讀的數(shù)據(jù)集改變,而是他的條件數(shù)據(jù)集改變。比如Select account.id where account.name="ppgogo*",第一次讀去了6個(gè)符合條件的id,第二次讀取的時(shí)候,由于事務(wù)b把一個(gè)帳號(hào)的名字由"dd"改成"ppgogo1",結(jié)果取出來了7個(gè)數(shù)據(jù)。

     

      Dirty reads non-repeatable reads phantom reads
    Serializable 不會(huì) 不會(huì) 不會(huì)
    REPEATABLE READ 不會(huì) 不會(huì) 會(huì)
    READ COMMITTED 不會(huì) 會(huì) 會(huì)
    Read Uncommitted 會(huì) 會(huì) 會(huì)

     

     

    三、readOnly

    事務(wù)屬性中的readOnly標(biāo)志表示對(duì)應(yīng)的事務(wù)應(yīng)該被最優(yōu)化為只讀事務(wù)。

    這是一個(gè)最優(yōu)化提示。在一些情況下,一些事務(wù)策略能夠起到顯著的最優(yōu)化效果,例如在使用Object/Relational映射工具(如:Hibernate或TopLink)時(shí)避免dirty checking(試圖“刷新”)。

    四、Timeout

    在事務(wù)屬性中還有定義“timeout”值的選項(xiàng),指定事務(wù)超時(shí)為幾秒。在JTA中,這將被簡(jiǎn)單地傳遞到J2EE服務(wù)器的事務(wù)協(xié)調(diào)程序,并據(jù)此得到相應(yīng)的解釋

     

     

    20110112

    數(shù)據(jù)庫提供了四種事務(wù)隔離級(jí)別, 不同的隔離級(jí)別采用不同的鎖類開來實(shí)現(xiàn). 

    在四種隔離級(jí)別中, Serializable的級(jí)別最高, Read Uncommited級(jí)別最低. 

    大多數(shù)數(shù)據(jù)庫的默認(rèn)隔離級(jí)別為: Read Commited,如Sql Server , Oracle. 

    少數(shù)數(shù)據(jù)庫默認(rèn)的隔離級(jí)別為Repeatable Read, 如MySQL InnoDB存儲(chǔ)引擎 

    即使是最低的級(jí)別,也不會(huì)出現(xiàn) 第一類 丟失 更新問題 .  

    1. 臟讀(事務(wù)沒提交,提前讀取) :臟讀就是指當(dāng)一個(gè)事務(wù)正在訪問數(shù)據(jù),并且對(duì)數(shù)據(jù)進(jìn)行了修改,而這種修改還沒有提交到數(shù)據(jù)庫中,這時(shí),另外一個(gè)事務(wù)也訪問這個(gè)數(shù)據(jù),然后使用了這個(gè)數(shù)據(jù)。 

    2. 不可重復(fù)讀(兩次讀的不一致) :是指在一個(gè)事務(wù)內(nèi),多次讀同一數(shù)據(jù)。在這個(gè)事務(wù)還沒有結(jié)束時(shí),另外一個(gè)事務(wù)也訪問該同一數(shù)據(jù)。那么,在第一個(gè)事務(wù)中的兩次讀數(shù)據(jù)之間,由于第二個(gè)事務(wù)的修改,那么第一個(gè)事務(wù)兩次讀到的的數(shù)據(jù)可能是不一樣的。這樣就發(fā)生了在一個(gè)事務(wù)內(nèi)兩次讀到的數(shù)據(jù)是不一樣的,因此稱為是不可重復(fù)讀。例如,一個(gè)編輯人員兩次讀取同一文檔,但在兩次讀取之間,作者重寫了該文檔。當(dāng)編輯人員第二次讀取文檔時(shí),文檔已更改。原始讀取不可重復(fù)。如果只有在作者全部完成編寫后編輯人員才可以讀取文檔,則可以避免該問題。 
    3. 幻讀 : 是指當(dāng)事務(wù)不是獨(dú)立執(zhí)行時(shí)發(fā)生的一種現(xiàn)象,例如第一個(gè)事務(wù)對(duì)一個(gè)表中的數(shù)據(jù)進(jìn)行了修改,這種修改涉及到表中的全部數(shù)據(jù)行。同時(shí),第二個(gè)事務(wù)也修改這個(gè)表中的數(shù)據(jù),這種修改是向表中插入一行新數(shù)據(jù)。那么,以后就會(huì)發(fā)生操作第一個(gè)事務(wù)的用戶發(fā)現(xiàn)表中還有沒有修改的數(shù)據(jù)行,就好象發(fā)生了幻覺一樣。例如,一個(gè)編輯人員更改作者提交的文檔,但當(dāng)生產(chǎn)部門將其更改內(nèi)容合并到該文檔的主復(fù)本時(shí),發(fā)現(xiàn)作者已將未編輯的新材料添加到該文檔中。如果在編輯人員和生產(chǎn)部門完成對(duì)原始文檔的處理之前,任何人都不能將新材料添加到文檔中,則可以避免該問題。 
    4. 第一類更新丟失(回滾丟失)  
      當(dāng)2個(gè)事務(wù)更新相同的數(shù)據(jù)源,如果第一個(gè)事務(wù)被提交,而另外一個(gè)事務(wù)卻被撤銷,那么會(huì)連同第一個(gè)事務(wù)所做的跟新也被撤銷。也就是說第一個(gè)事務(wù)做的跟新丟失了。 
    5. 第二類更新丟失(覆蓋丟失)  
      第二類更新丟失實(shí)在實(shí)際應(yīng)用中經(jīng)常遇到的并發(fā)問題,他和不可重復(fù)讀本質(zhì)上是同一類并發(fā)問題,通常他被看做不可重復(fù)讀的特例:當(dāng)2個(gè)或這個(gè)多個(gè)事務(wù)查詢同樣的記錄然后各自基于最初的查詢結(jié)果更新該行時(shí),會(huì)造成第二類丟失更新。因?yàn)槊總€(gè)事務(wù)都不知道不知道其他事務(wù)的存在,最后一個(gè)事務(wù)對(duì)記錄做的修改將覆蓋其他事務(wù)對(duì)該記錄做的已提交的跟新... 
    補(bǔ)充 : 基于元數(shù)據(jù)的 Spring 聲明性事務(wù) : 

    Isolation 屬性一共支持五種事務(wù)設(shè)置,具體介紹如下: 

    l          DEFAULT 使用數(shù)據(jù)庫設(shè)置的隔離級(jí)別 ( 默認(rèn) ) ,由 DBA 默認(rèn)的設(shè)置來決定隔離級(jí)別 . 

    l          READ_UNCOMMITTED 會(huì)出現(xiàn)臟讀、不可重復(fù)讀、幻讀 ( 隔離級(jí)別最低,并發(fā)性能高 )

    l          READ_COMMITTED  會(huì)出現(xiàn)不可重復(fù)讀、幻讀問題(鎖定正在讀取的行) 

    l          REPEATABLE_READ 會(huì)出幻讀(鎖定所讀取的所有行) 

    l          SERIALIZABLE 保證所有的情況不會(huì)發(fā)生(鎖表) 

    不可重復(fù)讀的重點(diǎn)是修改 : 
    同樣的條件 ,   你讀取過的數(shù)據(jù) ,   再次讀取出來發(fā)現(xiàn)值不一樣了 
    幻讀的重點(diǎn)在于新增或者刪除 
    同樣的條件 ,   第 1 次和第 2 次讀出來的記錄數(shù)不一樣 

    posted on 2014-03-26 11:00 丘比特 閱讀(115) 評(píng)論(0)  編輯  收藏

    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 日韩亚洲变态另类中文| 精品无码一区二区三区亚洲桃色| 免费日本一区二区| 亚洲人成电影在线天堂| 成年午夜视频免费观看视频| 一个人看的免费视频www在线高清动漫 | 亚洲视频免费播放| 粉色视频成年免费人15次 | 一区二区三区视频免费观看| 亚洲人成网址在线观看| 免费国产怡红院在线观看| 99re8这里有精品热视频免费| 亚洲国产中文在线视频| 亚洲人妻av伦理| 香蕉蕉亚亚洲aav综合| 亚洲日韩AV一区二区三区中文| 国产又黄又爽又猛的免费视频播放 | 亚洲综合精品香蕉久久网97| 亚洲成av人片天堂网老年人| 在线观看免费宅男视频| 亚欧免费视频一区二区三区| 久久久久久AV无码免费网站 | 成人免费无码大片a毛片软件| 最近中文字幕无免费| 免费高清国产视频| 在线人成免费视频69国产| 又硬又粗又长又爽免费看| 污视频网站免费观看| 国产精品成人亚洲| 美女视频黄a视频全免费网站色| ass亚洲**毛茸茸pics| 亚洲人和日本人jizz| 亚洲乱码卡一卡二卡三| 亚洲三级在线视频| youjizz亚洲| 亚洲精品无码专区久久| 亚洲爆乳大丰满无码专区| 亚洲大码熟女在线观看| 亚洲av色香蕉一区二区三区| 亚洲av日韩综合一区久热| 久久人午夜亚洲精品无码区|