成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Java程序中解決數(shù)據(jù)庫超時與死鎖

開發(fā) 后端 數(shù)據(jù)庫運維
在使用關(guān)系型數(shù)據(jù)庫的程序都可能遇到數(shù)據(jù)死鎖或不可用的情況,那么本文將從Java程序的角度,解決數(shù)據(jù)死鎖或不可用的難題。

簡介

每個使用關(guān)系型數(shù)據(jù)庫的程序都可能遇到數(shù)據(jù)死鎖或不可用的情況,而這些情況需要在代碼中編程來解決;本文主要介紹與數(shù)據(jù)庫事務(wù)死鎖等情況相關(guān)的重試邏輯概念,此外,還會探討如何避免死鎖等問題,文章以DB2(版本9)與Java為例進行講解。

什么是數(shù)據(jù)庫鎖定與死鎖

鎖定(Locking)發(fā)生在當一個事務(wù)獲得對某一資源的“鎖”時,這時,其他的事務(wù)就不能更改這個資源了,這種機制的存在是為了保證數(shù)據(jù)一致性;在設(shè)計與數(shù)據(jù)庫交互的程序時,必須處理鎖與資源不可用的情況。鎖定是個比較復(fù)雜的概念,仔細說起來可能又需要一大篇,所以在本文中,只把鎖定看作是一個臨時事件,這意味著如果一個資源被鎖定,它總會在以后某個時間被釋放。而死鎖發(fā)生在當多個進程訪問同一數(shù)據(jù)庫時,其中每個進程擁有的鎖都是其他進程所需的,由此造成每個進程都無法繼續(xù)下去。

如何避免鎖

我們可利用事務(wù)型數(shù)據(jù)庫中的隔離級別機制來避免鎖的創(chuàng)建,正確地使用隔離級別可使程序處理更多的并發(fā)事件(如允許多個用戶訪問數(shù)據(jù)),還能預(yù)防像丟失修改(Lost Update)、讀“臟”數(shù)據(jù)(Dirty Read)、不可重復(fù)讀(Nonrepeatable Read)及“虛”(Phantom)等問題。

隔離級別 問題現(xiàn)象

丟失修改 讀“臟”數(shù)據(jù) 不可重復(fù)讀
可重復(fù)讀取 No No No No
讀取穩(wěn)定性 No No No Yes
光標穩(wěn)定性 No No Yes Yes
未提交的讀 7No Yes Yes Yes

表1:DB2的隔離級別與其對應(yīng)的問題現(xiàn)象

在只讀模式中,就可以防止鎖定發(fā)生,而不用那些未提交只讀隔離級別的含糊語句。一條SQL語句當使用了下列命令之一時,就應(yīng)該考慮只讀模式了:

1、JOIN

2、SELECT DISTINCT

3、GROUP BY

4、ORDER BY

5、UNION

6、UNION ALL

7、SELECT

8、FOR FETCH ONLY (FOR READ ONLY)

9、SELECT FROM

如果包含上述任一命令,可以說你的SQL語句有歧義性,因此,鎖可能就是造成其中資源問題的源頭。

另外,以下是一些可降低鎖數(shù)目的建議:

1、 將CURRENTDATA設(shè)為NO。這條命令告訴DB2模糊光標為只讀。

2、 在適當?shù)臅r候,盡可能使用User Uncommitted Read(用戶未提交的讀)。

3、 盡可能關(guān)閉所有光標。

4、 有一個正確的提交策略。確保程序不再使用資源時就立即釋放它。

如何處理死鎖與超時

在程序中使用重試邏輯,可處理以下三種SQL錯誤代碼:

1、 904:返回這個代碼表示一條SQL語句是因為已達到資源限度而結(jié)束的。程序中可提交或回滾更改,并執(zhí)行重試邏輯。

2、 911:程序收到這個SQL代碼,表示因為沒有為鎖列表分配足夠的內(nèi)存,現(xiàn)在已達到數(shù)據(jù)庫的最大鎖數(shù)目。

3、 912:程序收到這個SQL代碼,表示死鎖或超時,依照904中的方法來解決。

以下是一段Java代碼,其捕捉返回的-911、-912、-904代碼,并進行重試:

for (int i = 0; i < MAX_RETRY_ATTEMPTS; i++) {

//以下代碼模擬一次事務(wù)

try {

stmt = conn.createStatement();

System.out.println("Transaction started...");

stmt.executeUpdate("UPDATE 1..."); //SQL語句1

stmt.executeUpdate("UPDATE 2..."); // SQL語句2

stmt.executeUpdate("UPDATE 3..."); // SQL語句3

stmt.executeUpdate("UPDATE 3..."); // SQL語句4

//提交所有更改

conn.commit();

System.out.println("事務(wù)已完成。");

//確保只運行了一次。

i = MAX_RETRY_ATTEMPTS;

} catch (SQLException e) {

/**

*如果返回的SQL代碼為-911,回滾會自動完成,程序回滾至前一次的提交狀態(tài)。

*程序?qū)⑦M行重試。

*/

if (-911 == e.getErrorCode()) {

//等待RETRY_WAIT_TIME

try {

Thread.sleep(RETRY_WAIT_TIME);

} catch (InterruptedException e1) {

//即使休眠被打斷,但仍要重試。

System.out.println("休眠被打斷。");

}

}

/**

*如果返回的SQL代碼為-912,表示死鎖及超時。

*如果是-904,代表已達到資源限度。

*在這種情況下,程序?qū)⒒貪L并進行重試。

*/

else if (-912 == e.getErrorCode() || -904 == e.getErrorCode()) {

try {

//需要回滾

conn.rollback();

} catch (SQLException e1) {

System.out.println("無法回滾。"; color:black'> + e);

}

try {

//等待RETRY_WAIT_TIME

Thread.sleep(RETRY_WAIT_TIME);

} catch (InterruptedException e1) {

//即使休眠被打斷,但仍要重試。

System.out.println("休眠被打斷。" + e1);

}

} else {

//如果是其他錯誤,就不進行重試。

i = MAX_RETRY_ATTEMPTS;

System.out.println("有錯誤發(fā)生,錯誤代碼:"

+ e.getErrorCode() + " SQL狀態(tài):"

+ e.getSQLState() + "其他信息:" + e.getMessage());

}

從上面也可看到,程序?qū)λ梨i、超時、最大鎖數(shù)目將會進行MAX_RETRY_ATTEMPTS次重試;其次,當“最大鎖數(shù)目”的情況發(fā)生時 (-911),程序不必手工進行回滾,因為此時的回滾是自動完成的;最后,無論何時返回-911、-904、-912代碼,程序應(yīng)在下次重試前等待 RETRY_WAIT_TIME一段時間。

【編輯推薦】

  1. 減少SQL Server數(shù)據(jù)庫死鎖的方法
  2. 關(guān)系數(shù)據(jù)庫的末日是否已經(jīng)來臨
  3. 解決MySQL 5數(shù)據(jù)庫連接超時問題
責(zé)任編輯:彭凡 來源: 網(wǎng)絡(luò)
相關(guān)推薦

2011-06-07 11:09:19

JAVA

2011-03-11 17:27:33

Java數(shù)據(jù)庫超時

2019-05-13 08:24:58

數(shù)據(jù)庫MySQLInnoDB

2023-09-13 14:52:11

MySQL數(shù)據(jù)庫

2009-03-24 10:45:39

MySQL5連接超時數(shù)據(jù)庫

2010-04-26 13:23:49

Oracle數(shù)據(jù)庫

2024-06-21 09:37:57

2024-08-19 11:45:18

2011-06-03 10:50:27

Java

2023-09-21 23:08:36

MySQL數(shù)據(jù)庫死鎖

2011-03-08 09:27:34

SQL Server數(shù)死鎖

2010-11-29 10:11:05

Sybase數(shù)據(jù)庫死鎖

2009-03-30 10:56:58

SQL Server數(shù)據(jù)庫死鎖數(shù)據(jù)庫

2017-10-25 15:27:52

MySQL數(shù)據(jù)庫超時設(shè)置

2011-08-10 15:46:29

數(shù)據(jù)庫

2010-07-06 14:40:15

解決SQL Serve

2009-03-31 11:57:52

2011-04-27 09:25:13

MySQL字符型數(shù)據(jù)

2011-03-28 13:11:18

MySQL數(shù)據(jù)庫安全

2024-07-05 09:19:52

點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 91av在线免费播放 | 日韩精品专区在线影院重磅 | 国产日韩精品在线 | 999久久久 | 91九色视频在线 | 日本久久久影视 | 热99| 99视频在线免费观看 | 亚洲一区二区三 | 中文字幕在线观看视频一区 | 一级毛片黄片 | www.国产精| 国产成人av在线播放 | 亚洲精品国产第一综合99久久 | 久久久久九九九九 | 国外成人在线视频 | 一级a性色生活片久久毛片波多野 | 亚洲精品久久视频 | 久久躁日日躁aaaaxxxx | 天堂一区二区三区 | 99re视频在线 | 欧美一区二区三区日韩 | 日韩av成人在线观看 | 99视频免费看 | 男女网站免费 | 国产精品久久久久久 | 国产精品亚洲成在人线 | 久久这里有精品 | 午夜久久久 | av中文在线观看 | 一级片在线观看视频 | 色婷婷亚洲国产女人的天堂 | 中文字幕视频免费 | caoporn国产精品免费公开 | 亚洲综合一区二区三区 | 精品国产一区探花在线观看 | 日韩高清一区二区 | 亚洲视频第一页 | 一级在线毛片 | 欧美lesbianxxxxhd视频社区 | 欧美精品一区二区三区在线播放 |