摘要:對(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 ListfetchSomeBizExpressDaily(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
摘要:大多數(shù)保證線程安全的方法是添加各種類型鎖,使用各種同步機(jī)制,用限制對(duì)共享的可變的類變量并發(fā)訪問的方式來保證線程安全。只有保證這兩條語句及中間語句以原子方式執(zhí)行,才能避免多線程覆蓋問題。 前言 對(duì)于線程安全,我們有說不盡的話題。大多數(shù)保證線程安全的方法是添加各種類型鎖,使用各種同步機(jī)制,用限制對(duì)共享的、可變的類變量并發(fā)訪問的方式來保證線程安全。文本從另一個(gè)角度,使用比較交換算法(Comp...
摘要:下面是線程相關(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è)和程序員...
摘要:的線程機(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ī)制是...
閱讀 3025·2023-04-25 20:22
閱讀 3345·2019-08-30 11:14
閱讀 2595·2019-08-29 13:03
閱讀 3183·2019-08-26 13:47
閱讀 3226·2019-08-26 10:22
閱讀 1271·2019-08-23 18:26
閱讀 619·2019-08-23 17:16
閱讀 1913·2019-08-23 17:01