JDBC高階使用和資料庫事務

2021-08-26 15:20:59 字數 4244 閱讀 4444

批量處理允許您將相關的sql語句分組到批處理中,並通過對資料庫的一次呼叫提交它們。

當一次向資料庫傳送多個sql語句時,可以減少連線資料庫的開銷,從而提高效能。

以下是使用語句物件的批處理的典型步驟序列

// create statement object

statement stmt = conn.createstatement();

// set auto-commit to false

conn.setautocommit(false);

// create sql statement

string sql = "insert into employees (id, first, last, age) " +

"values(200,'zia', 'ali', 30)";

// add above sql statement in the batch.

stmt.addbatch(sql);

// create one more sql statement

string sql = "insert into employees (id, first, last, age) " +

"values(201,'raj', 'kumar', 35)";

// add above sql statement in the batch.

stmt.addbatch(sql);

// create one more sql statement

string sql = "update employees set age = 35 " +

"where id = 100";

// add above sql statement in the batch.

stmt.addbatch(sql);

// create an int to hold returned values

int count = stmt.executebatch();

conn.commit();

使用佔位符建立sql語句。

使用preparestatement() 方法建立preparestatement物件。

使用setautocommit()將auto-commit設定為false 。

使用addbatch()方法在建立的語句物件上新增您喜歡的sql語句到批處理中。

在建立的語句物件上使用executebatch()方法執行所有sql語句。

最後,使用commit()方法提交所有更改。

// create sql statement

string sql = "insert into employees (id, first, last, age) " +

"values(?, ?, ?, ?)";

// create preparestatement object

preparedstatemen pstmt = conn.preparestatement(sql);

//set auto-commit to false

conn.setautocommit(false);

// set the variables

pstmt.setint( 1, 400 );

pstmt.setstring( 3, "singh" );

pstmt.setint( 4, 33 );

// add it to the batch

pstmt.addbatch();

// set the variables

pstmt.setint( 1, 401 );

pstmt.setstring( 2, "pawan" );

pstmt.setstring( 3, "singh" );

pstmt.setint( 4, 31 );

// add it to the batch

pstmt.addbatch();

//add more batches

//create an int to hold returned values

int count = stmt.executebatch();

conn.commit();

一組要麼同時執行成功,要麼同時執行失敗的sql語句。是資料庫操作的乙個執行單元。

事務的四大特點(acid)

表示乙個事務內的所有操作是乙個整體,要麼全部成功,要麼全部失敗

表示乙個事務內有乙個操作失敗時,所有的更改過的資料都必須回滾到修改前狀態

事務檢視資料時資料所處的狀態,要麼是另一併發事務修改它之前的狀態,要麼是另一事務修改它之後的狀態,事務不會檢視中間狀態的資料。

永續性事務完成之後,它對於系統的影響是永久性的。

sql標準定義了4類隔離級別,包括了一些具體規則,用來限定事務內外的哪些改變是可見的,哪些是不可見的。低階別的隔離級一般支援更高的併發處理,並擁有更低的系統開銷。

read uncommitted(讀取未提交內容)

​ 在該隔離級別,所有事務都可以看到其他未提交事務的執行結果。本隔離級別很少用於實際應用,因為它的效能也不比其他級別好多少。讀取未提交的資料,也被稱之為髒讀(dirty read)。

read committed(讀取提交內容)

​ 這是大多數資料庫系統的預設隔離級別(但不是mysql預設的)。它滿足了隔離的簡單定義:乙個事務只能看見已經提交事務所做的改變。這種隔離級別也支援所謂的不可重複讀(nonrepeatable read),因為同一事務的其他例項在該例項處理其間可能會有新的commit,所以同一select可能返回不同結果。

repeatable read可重讀

​ 這是mysql的預設事務隔離級別,它確保同一事務的多個例項在併發讀取資料時,會看到同樣的資料行。不過理論上,這會導致另乙個棘手的問題:幻讀(phantom read)。簡單的說,幻讀指當使用者讀取某一範圍的資料行時,另乙個事務又在該範圍內插入了新行,當使用者再讀取該範圍的資料行時,會發現有新的「幻影」 行。innodb和falcon儲存引擎通過多版本併發控制(mvcc,multiversion concurrency control)機制解決了該問題。

serializable可序列化​ 這是最高的隔離級別,它通過強制事務排序,使之不可能相互衝突,從而解決幻讀問題。簡言之,它是在每個讀的資料行上加上共享鎖。在這個級別,可能導致大量的超時現象和鎖競爭。

​ 這四種隔離級別採取不同的鎖型別來實現,若讀取的是同乙個資料的話,就容易發生問題。

例如:

​   髒讀(drity read):某個事務已更新乙份資料,另乙個事務在此時讀取了同乙份資料,由於某些原因,前乙個rollback了操作,則後乙個事務所讀取的資料就會是不正確的。

​   不可重複讀(non-repeatableread):在乙個事務的兩次查詢之中資料不一致,這可能是兩次查詢過程中間插入了乙個事務更新的原有的資料。

​   幻讀(phantom read):在乙個事務的兩次查詢中資料筆數不一致,例如有乙個事務查詢了幾列(row)資料,而另乙個事務卻在此時插入了新的幾列資料,先前的事務在接下來的查詢中,就會發現有幾列資料是它先前所沒有的

mysql中事物的控制:begin;執行sql;出錯了 rollback;沒有出錯: commit;

如果jdbc連線處於自動提交模式,預設情況下,則每個sql語句在完成後都會提交到資料庫。

事務使您能夠控制是否和何時更改應用於資料庫。它將單個sql語句或一組sql語句視為乙個邏輯單元,如果任何語句失敗,則整個事務將失敗。

要啟用手動事務支援,而不是jdbc驅動程式預設使用的自動提交模式,請使用connection物件的setautocommit()方法。如果將boolean false傳遞給setautocommit(),則關閉自動提交。我們可以傳遞乙個布林值true來重新開啟它。

trycatch(sqlexception se)
1、要取消掉jdbc的自動提交:void setautocommit(boolean autocommit)

2、執行各個sql語句,加入到批處理之中

3、如果所有語句執行成功,則提交事務 commit();如果出現了錯誤,則回滾:rollback()

try  catch (exception e)  catch (sqlexception e1) 

}

JDBC資料庫事務

事務 一組邏輯操作單元,使資料從一種狀態變換到另一種狀態。事務處理 事務操作 保證所有事務都作為乙個工作單元來執行,即使出現了故障,都不能改變這種執行方式。當在乙個事務中執行多個操作時,要麼所有的事務都被提交 commit 那麼這些修改就永久地儲存下來 要麼資料庫管理系統將放棄所作的所有修改,整個事...

JDBC 資料庫事務

事務 一組邏輯操作單元,使資料從一種狀態變換到另一種狀態。事務處理 也稱為事務操作,保證所有事務都作為乙個工作單元來執行,即使出現了故障,都不能改變這種執行方式。當在乙個事務中執行多個操作時,要麼所有的事務都被提交 commit 那麼這些修改就永久的儲存下來 要麼資料庫管理系統將丟棄所作的所有修改,...

JDBC 之 資料庫事務

原子性 atomicity 原子性是指事務是乙個不可分割的工作單位,事務中的操作要麼都發生,要麼都不發生。一致性 consistency 事務必須使資料庫從乙個一致性狀態變換到另外乙個一致性狀態。隔離性 isolation 事務的隔離性是指乙個事務的執行不能被其他事務干擾,即乙個事務內部的操作及使用...