国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

多線程并發(fā)同一個(gè)表問題

XiNGRZ / 1787人閱讀

摘要:對(duì)比發(fā)現(xiàn),發(fā)現(xiàn)對(duì)于單表來說和效果一樣,只有在多表查詢時(shí)產(chǎn)生差異,這個(gè)差異在于使用戶能夠鎖定多表中的指定表或表的數(shù)據(jù)行。

現(xiàn)有數(shù)據(jù)庫(kù)開發(fā)過程中對(duì)事務(wù)的控制、事務(wù)鎖、行鎖、表鎖的發(fā)現(xiàn)缺乏必要的方法和手段,通過以下手段可以豐富我們處理開發(fā)過程中處理鎖問題的方法。
For Update和For Update of使用戶能夠鎖定指定表或表的數(shù)據(jù)行這個(gè)功能在實(shí)際應(yīng)用中具有很重要的意義,特別對(duì)于多用戶多線程處理中如要先獲取數(shù)據(jù)通過判斷在去更新數(shù)據(jù)(這中間不允許數(shù)據(jù)發(fā)生變化)的時(shí)候這個(gè)SQL功能是唯一最佳的選擇。
此外,為了解決因?yàn)镕or Update而引起的死鎖問題,Oracle提供了select...[for update [of tab.col]] [nowait]功能,這個(gè)功能使得在執(zhí)行select...for update前先檢查所申請(qǐng)的行、表資源是否可用,如果可用則加寫鎖,否則直接返回Ora-54錯(cuò)誤。這個(gè)功能也用很好的應(yīng)用價(jià)值,在多線程中判斷資源的可用性方面將發(fā)揮作用。

Table For Update For Update of A.Id
A 1.有where條件時(shí),鎖定條件中指定的數(shù)據(jù)行(行級(jí)封鎖);
2.無where條件是,鎖定表A(表級(jí)封鎖)。 1.有where條件時(shí),鎖定條件中指定的數(shù)據(jù)行(行級(jí)封鎖);
2.無where條件是,鎖定表A(表級(jí)封鎖)。
A,B 直接封鎖A,B表(表級(jí)封鎖) 1.有where條件時(shí),封鎖where條件中滿足條件的A表的數(shù)據(jù)行(行級(jí)封鎖),B表不鎖定;
2.無where條件是,鎖定A表(表級(jí)鎖),B表不鎖定。

對(duì)比發(fā)現(xiàn),發(fā)現(xiàn)對(duì)于單表來說For Update和For Update of效果一樣,只有在多表查詢時(shí)產(chǎn)生差異,這個(gè)差異在于For Update of使用戶能夠鎖定多表中的指定表或表的數(shù)據(jù)行。

以代碼為例:

背景:有4臺(tái)線上任務(wù)服務(wù)器,處理同一個(gè)表中的數(shù)據(jù),為了避免引起數(shù)據(jù)讀寫混亂,采用了for update的方式來加鎖

@SuppressWarnings("unchecked")

public List fetchSomeBizExpressDaily(final String serverIp, final int some)
                                                                                              throws DataAccessException {
    return (List) new TransactionTemplate(transactionManager).execute(new TransactionCallback() {

        @SuppressWarnings("rawtypes")
        public Object doInTransaction(TransactionStatus status) {
            // 取得鎖的鑰匙
            getSqlMapClientTemplate().queryForObject("MS-SELECT-ACTION-LOCK-BY-LOCK-NAME-FOR-UPDATE", "bizexpress");

            List bizexpresses = getSqlMapClientTemplate().queryForList(
                                                                                          "MS-FIND-SOME-BIZ-EXPRESS",
                                                                                          Integer.valueOf(some));

            Map param = new HashMap();
            param.put("serverIp", serverIp);
            param.put("some", Integer.valueOf(some));
            getSqlMapClientTemplate().update("MS-UPDATE-SOME-BIZ-EXPRESS", param);

            return bizexpresses;
        }
    });
}

上面中的MS-SELECT-ACTION-LOCK-BY-LOCK-NAME-FOR-UPDATE,

通這這段代碼對(duì)表加鎖,這樣其它線程當(dāng)執(zhí)行到此處時(shí)會(huì)處于等待狀態(tài),直到表鎖釋放,這樣可以限制其它線程訪問biz_express_daily表執(zhí)行下面sql語句


    

從而有效的解決了多線程并發(fā)數(shù)據(jù)庫(kù)表的問題。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/65097.html

相關(guān)文章

  • Java線程奇幻之旅——CAS算法實(shí)現(xiàn)線程安全

    摘要:大多數(shù)保證線程安全的方法是添加各種類型鎖,使用各種同步機(jī)制,用限制對(duì)共享的可變的類變量并發(fā)訪問的方式來保證線程安全。只有保證這兩條語句及中間語句以原子方式執(zhí)行,才能避免多線程覆蓋問題。 前言 對(duì)于線程安全,我們有說不盡的話題。大多數(shù)保證線程安全的方法是添加各種類型鎖,使用各種同步機(jī)制,用限制對(duì)共享的、可變的類變量并發(fā)訪問的方式來保證線程安全。文本從另一個(gè)角度,使用比較交換算法(Comp...

    jasperyang 評(píng)論0 收藏0
  • 想進(jìn)大廠?50個(gè)線程面試題,你會(huì)少?(一)

    摘要:下面是線程相關(guān)的熱門面試題,你可以用它來好好準(zhǔn)備面試。線程安全問題都是由全局變量及靜態(tài)變量引起的。持有自旋鎖的線程在之前應(yīng)該釋放自旋鎖以便其它線程可以獲得自旋鎖。 最近看到網(wǎng)上流傳著,各種面試經(jīng)驗(yàn)及面試題,往往都是一大堆技術(shù)題目貼上去,而沒有答案。 不管你是新程序員還是老手,你一定在面試中遇到過有關(guān)線程的問題。Java語言一個(gè)重要的特點(diǎn)就是內(nèi)置了對(duì)并發(fā)的支持,讓Java大受企業(yè)和程序員...

    wow_worktile 評(píng)論0 收藏0
  • 【J2SE】java并發(fā)基礎(chǔ)

    摘要:的線程機(jī)制是搶占式。會(huì)讓出當(dāng)多個(gè)線程并發(fā)的對(duì)主存中的數(shù)據(jù)進(jìn)行操作時(shí),有且只有一個(gè)會(huì)成功,其余均失敗。和對(duì)象只有在困難的多線程問題中才是必須的。 并發(fā)簡(jiǎn)述 并發(fā)通常是用于提高運(yùn)行在單處理器上的程序的性能。在單 CPU 機(jī)器上使用多任務(wù)的程序在任意時(shí)刻只在執(zhí)行一項(xiàng)工作。 并發(fā)編程使得一個(gè)程序可以被劃分為多個(gè)分離的、獨(dú)立的任務(wù)。一個(gè)線程就是在進(jìn)程中的一個(gè)單一的順序控制流。java的線程機(jī)制是...

    tianyu 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<