日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

java数据库编程——事务

發布時間:2023/12/3 53 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java数据库编程——事务 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

【0】README

1) 本文部分文字描述轉自 core java volume 2 , 測試源代碼均為原創, 旨在理解 java數據庫編程——事務 的基礎知識 ;
2)for database connection config, please visit : https://github.com/pacosonTang/core-java-volume/blob/master/coreJavaAdvanced/chapter4/database.properties


【1】事務相關

1)事務定義:將一組語句構建成一個事務;

  • 1.1)當所有語句被順利執行后, 事務可以提交;否則,如果其中某個語句遇到錯誤,那么事務將被回滾,就好像沒有任何語句執行過一樣;
  • 1.2)將多個語句組合成事務的原因: 為了確保數據庫完整性;(干貨——將多個語句組合成事務的原因)

2)自動提交模式: 默認情況下, 數據庫連接處于 自動提交模式, 每個 sql 語句一旦被執行便被提交給 數據庫, 一旦命令被提交, 就無法對它進行 回滾操作;(干貨——sql語句的執行(execute)與提交(commit)是兩個概念)

  • 2.1)在使用事務時, 需要關閉這個默認值;
    conn.setAutoCommit(false);
  • 2.2)現在可以使用通常的方法創建一個語句對象:
    Statement stat = conn.createStatement();
  • 2.3)然后任意多次調用executeUpdate 方法:
    stat.executeUpdate(comman1);
  • 2.4)如果執行了所有命令之后沒有出錯,則調用 commit 方法:
    conn.commit();
  • 2.5)如果出錯,則調用
    conn.rollback(); //回滾操作

【2】保存點

1)保存點作用: 創建一個保存點意味著稍后只需要返回這個點,而非事務的開頭; (干貨——保存點作用)
2)看個荔枝:

Statement stat = conn.createStatement();//創建語句
stat.executeUpdate(command1);
Savepoint point = conn.setSavepoint();//創建保存點
stat.executeUpdate(command1);
if(…)
conn.rollback(point); //回滾操作

conn.commit();

  • 2.1)當不再需要保存點 的時候, 必須釋放它; (干貨——釋放保存點)
    conn.releaseSavepoint(point);

【3】批量更新

1)批量更新的作用: 一個程序需要執行多條insert 語句, 可以使用批量更新方法來提高程序性能; (干貨——批量更新的作用: 一個程序需要執行多條insert 語句)
Attention)

  • A1)使用 DatabaseMetaData 接口中的 supportsBatchUpdates 方法可以獲知數據庫是否支持這種特性;
  • A2)處于同一批的語句可以是, insert, update, delete等 DML操作, 也可以是數據庫定義語句, 如create, drop 等DDL;
  • A3) 但是, 在批量處理中添加 select 語句會拋出異常(從概念上講, 批量處理中的 select 語句沒有意義, 因為它會返回結果集, 而并不更新數據庫) (干貨——在批量處理中添加 select 語句會拋出異常)

2)使用批量更新的步驟:

  • step1)創建一個 Statement對象:
    Statement stat = conn.createStatement();
  • step2) 應該調用 addBatch 方法, 而不是 executeUpdate 方法:
    String command = “create table …. “;
    stat.addBatch(command);
  • step3)循環提交 insert 語句:

    while(…)
    {
    command = “insert into …”;
    stat.addBatch(command);
    }

  • step4)最后 , 提交整個批量更新語句;

    int[] counts = stat.executeBatch();

Attention)

  • A1)調用executeBatch 方法將為所有已提交的語句返回一個 記錄數的數目;
  • A2)為了在批量模式下正確地處理錯誤, 必須將批量執行的操作視為單個事務。 如果批量更新在執行過程中失敗, 那么必須將它回滾到批量操作開始之前的狀態;
  • A3)首先關閉自動提交模式, 然后收集批量操作, 執行并提交該操作, 最后恢復最初 的自動提交模式:

    • step1)關閉自動提交模式:

      boolean autoCommit = conn.getAutoCommit();
      conn.setAutoCommit(false);
      Statement stat = conn.getStatement();

    • step2)然后收集批量操作:
      // keep calling stat.addBatch();

    • step3)執行并提交該操作;
      stat.executeBatch();
      stat.commit();
    • step4)最后恢復最初 的自動提交模式;
      conn.setAutoCommit(autoCommit);

3)看個荔枝(利用批量更新添加兩行記錄,且添加前設置保存點):

  • 3.1)for souce code, please visit : https://github.com/pacosonTang/core-java-volume/blob/master/coreJavaAdvanced/chapter4/SavePointsTest.java
  • 3.2)key source code at a glance:
public static void main(String[] args){Connection conn = null;Savepoint savepoint1 = null;try{Connection conn1 = getConnection();conn = conn1;conn.setAutoCommit(false);// step1.關閉自動提交Statement stat = conn.createStatement();// set a Savepointsavepoint1 = conn.setSavepoint("savepoint1"); // step2.收集批量操作(add batch update)stat.addBatch("insert into student values(1,'savepoint1')");stat.addBatch("insert into student values(1,'savepoint2')");// step3.執行并提交該操作stat.executeBatch();// If there is no error, commit the changes.conn.commit();// step4.回復最初的自動提交模式conn.setAutoCommit(true);System.out.println("successful update!");conn.releaseSavepoint(savepoint1); //當不再需要保存點 的時候, 必須釋放它conn.close();//關閉數據庫連接} catch (Exception e){try{conn.rollback(savepoint1);//回滾System.out.println("failed update!");e.printStackTrace(); } catch (SQLException e1){e1.printStackTrace();}}}
  • 3.3)relative printing results as follows:

4)看個荔枝(一個回滾的荔枝):

  • 4.1)for souce code, please visit : 同上;
  • 4.2)key source code at a glance: 同上;
  • 4.3)relative printing results as follows:

【4】高級SQL類型

1) sql 數據類型及其對應的java類型(圖片地址:http://www.cnblogs.com/shishm/archive/2012/01/30/2332142.html)

2)SQL ARRAY(SQL 數組)指的是值的序列;

  • 2.1)如, Student 表中通常都會有一個 Scores 列, 這個列就應該是 ARRAY OF INTEGER(整數數組);
  • 2.2)getArray方法: 返回一個接口類型為 java.sql.Array 的對象,該接口中有許多方法可以用于獲取數組的值;

3)從數據庫中獲得一個 LOB 或數組并不等于獲取了它的實際內容, 只有在訪問具體值的時候, 它們才會從 數據庫中被讀取出來;
4)ROWID值: 某些數據庫支持描述行位置的 ROWID值, 這樣就可以非常快捷地獲取某一行值;

  • 4.1)JDBC 4 引入了 java.sql.RowId 接口: 并提供了用于在查詢中提供 行 ID, 以及從結果中獲取該值的方法;

5)國家屬性字符串(NCHAR及其變體): 按照本地字符編碼機制存儲字符串,并使用本地排序慣例對這些字符串進行排序;

  • 5.1) JDBC 4 提供了這種方法, 用于在查詢和結果中進行 java 的 string 對象和國家屬性字符串之間的雙向轉換;

6)有些數據庫提供了用于XML 數據的本地存儲。

  • 6.1)JDBC 4 引入了 SQLXML接口: 它可以在內部的 XML 表示和 DOM 的 Source/Result 接口或二進制流之間起到中間作用。

總結

以上是生活随笔為你收集整理的java数据库编程——事务的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。