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

資訊專欄INFORMATION COLUMN

多線程并發同一個表問題

XiNGRZ / 1789人閱讀

摘要:對比發現,發現對于單表來說和效果一樣,只有在多表查詢時產生差異,這個差異在于使用戶能夠鎖定多表中的指定表或表的數據行。

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

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

對比發現,發現對于單表來說For Update和For Update of效果一樣,只有在多表查詢時產生差異,這個差異在于For Update of使用戶能夠鎖定多表中的指定表或表的數據行。

以代碼為例:

背景:有4臺線上任務服務器,處理同一個表中的數據,為了避免引起數據讀寫混亂,采用了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,

通這這段代碼對表加鎖,這樣其它線程當執行到此處時會處于等待狀態,直到表鎖釋放,這樣可以限制其它線程訪問biz_express_daily表執行下面sql語句


    

從而有效的解決了多線程并發數據庫表的問題。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/65097.html

相關文章

  • Java線程奇幻之旅——CAS算法實現線程安全

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

    jasperyang 評論0 收藏0
  • 想進大廠?50個線程面試題,你會少?(一)

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

    wow_worktile 評論0 收藏0
  • 【J2SE】java并發基礎

    摘要:的線程機制是搶占式。會讓出當多個線程并發的對主存中的數據進行操作時,有且只有一個會成功,其余均失敗。和對象只有在困難的多線程問題中才是必須的。 并發簡述 并發通常是用于提高運行在單處理器上的程序的性能。在單 CPU 機器上使用多任務的程序在任意時刻只在執行一項工作。 并發編程使得一個程序可以被劃分為多個分離的、獨立的任務。一個線程就是在進程中的一個單一的順序控制流。java的線程機制是...

    tianyu 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<