日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

JDBC——编程式事务的实现逻辑

發(fā)布時間:2025/3/12 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JDBC——编程式事务的实现逻辑 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

引言

數(shù)據(jù)庫事務的概念和基礎,總結在《MySQL 基礎 ————事務與隔離級別總結》。

本篇博客通過“JDBC + 純編碼”方式實現(xiàn)事務控制,完成一個 A 給 B 轉賬的小功能,在進一步熟練JDBC的編程流程的同時,重點關注 Java 語言如何操作和控制事務

一、事務自動提交的三種情況

事務默認自動提交的三種情況:

1、DDL操作執(zhí)行后,會自動提交事務,SET autocommit=false 對該類語句不管用。不過,在DDL語言上一般不考慮事務。

2、DML(增、刪、改)默認情況下,執(zhí)行后會自動提交,不過可以通過 set autocommit=false;取消 DML的自動提交。

3、數(shù)據(jù)庫連接關閉時,默認會自動提交事務。因此,如果兩次DML操作在同一事務中,則事務中間不可以關閉連接。

一般的事務控制只需要考慮后兩種情況,我們需要做的就是在當前連接中取消自動提交,在整體邏輯完成后,提交事務或異?;貪L,最后恢復自動提交

二、邏輯介紹、庫表及實體類

如下圖,兩條用戶信息,完成 Morty 轉賬 100 塊給 Jack 的轉賬功能。涉及兩步操作:1、Morty 減少 100? ?2、Jack 增加 100

User 實體類:

public class User {private Integer id;private String name;private Date birthDay;private Integer balance;public User() {}// ... getter setter... }

三、數(shù)據(jù)庫連接獲取與資源關閉工具類

該工具類使用 JDBC API 完成對數(shù)據(jù)庫連接的獲取,及關閉操作,代碼邏輯與注意事項參考《JDBC——概述與JDBC的使用》

import java.io.InputStream; import java.sql.*; import java.util.Properties;public class JDBCUtils {public static Connection getConnection() {Connection connection = null;try {// 默認的識別路徑就是 src 目錄下InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("jdbc.properties");Properties props = new Properties();props.load(is);String url = props.getProperty("url");String username = props.getProperty("username");String password = props.getProperty("password");String driverName = props.getProperty("driverName");// 加載驅動類Class.forName(driverName);// 獲取連接connection = DriverManager.getConnection(url, username, password);} catch (Exception e) {e.printStackTrace();}return connection;}public static void closeResource(Connection conn, Statement statement, ResultSet rs) {try {if (rs != null) {rs.close();}} catch (SQLException e) {e.printStackTrace();}try {if (statement != null) {statement.close();}} catch (SQLException e) {e.printStackTrace();}try {if (conn != null) {conn.close();}} catch (SQLException e) {e.printStackTrace();}} }

四、轉賬操作邏輯實現(xiàn)

在《JDBC——概述與JDBC的使用》中,展示了簡單的入庫操作,這里可以將其優(yōu)化為通用的更新操作:

/*** 數(shù)據(jù)庫更新操作*/private static int update(Connection connection, String sql, Object... args) throws Exception {PreparedStatement ps = null;try {ps = connection.prepareStatement(sql);// 填充屬性for (int i = 0; i < args.length; i++) {ps.setObject(i + 1, args[i]);}int rows = ps.executeUpdate();return rows;} finally {JDBCUtils.closeResource(null, ps, null);}}

上述代碼中,方法參數(shù)接收一個連接Connection 對象,這是因為,在執(zhí)行完更新操作后,不可以直接關閉連接,否則會自動提交事務,在最后的finally塊中,也要注意,不要將 Connection對象傳入關閉資源的方法中,以免誤關Connection。并且如果發(fā)生異常,直接拋出即可,這是因為如果在此過程中發(fā)生異常,既可以將情況反映給調(diào)用方,也可以在 finally 塊中關閉必要的資源。

/*** 轉賬(事務控制)*/private static void transferAccountsTx() {Connection connection = null;try {connection = JDBCUtils.getConnection();// 關閉自動提交connection.setAutoCommit(false);// 轉賬金額Integer amount = 100;// 減少金額String sql1 = "UPDATE user SET balance = balance - ? WHERE name = ?";update(connection, sql1, amount, "Morty");// 模擬異常System.out.println(10 / 0);// 增加金額String sql2 = "UPDATE user SET balance = balance + ? WHERE name = ?";update(connection, sql2, amount, "Jack");// 執(zhí)行提交connection.commit();System.out.println("轉賬成功!");} catch (Exception e) {e.printStackTrace();try {// 異常回滾connection.rollback();} catch (SQLException ex) {ex.printStackTrace();}} finally {try {// 恢復事務自動提交,針對連接池的情況需要額外注意該操作connection.setAutoCommit(true);} catch (SQLException e) {e.printStackTrace();}JDBCUtils.closeResource(connection, null, null);}}

上述代碼中,通過 .setAutoCommit(false) 關閉自動提交,開啟事務,?并通過 10 ÷ 0 的操作,模擬了一個轉賬過程中的異常,捕獲異常時,我們要執(zhí)行回滾操作。如果邏輯可以正常執(zhí)行,就使用? commit(); 完成提交操作。最后在整體邏輯后面,使用 finally 塊恢復事務自動提交(實際上,如果是關閉Connection,并不需要恢復自動提交,但如果是連接池的情況,重復利用連接就需要這么做),并關閉 Connection 。

五、通過代碼設置數(shù)據(jù)庫事務隔離級別

一般情況,不需要通過代碼層面更改數(shù)據(jù)庫事務,不過可以了解,事務隔離級別非常簡單,具體概念可以參考《MySQL 基礎 ————事務與隔離級別總結》。

使用 Connection 對象可以設置和獲取隔離級別:

// 獲取事務隔離級別 connection.getTransactionIsolation();// 設置事務隔離級別 connection.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);

Connection 中定義了 4 種事務隔離級別的常量,從低到高分別是:

int TRANSACTION_READ_UNCOMMITTED = 1; int TRANSACTION_READ_COMMITTED = 2; int TRANSACTION_REPEATABLE_READ = 4; int TRANSACTION_SERIALIZABLE = 8;

總結

需要考慮事務自動提交的兩種情況:

1、DML語句會自動提交事務,需要 set autocommit=false 關閉自動提交,對應 JDBC的 API 就是?

connection.setAutoCommit(false);

2、關閉連接會自動提交事務,一定要在完成全部事務操作后才可以關閉 Connection 。代碼中一定要注意? connection.close() 的位置!

三個事務控制的新方法:

// 關閉自動提交 connection.setAutoCommit(false); ... // 手動提交事務 connection.commit(); ... // 異常時回滾事務 connection.rollback();

另外,每條SQL執(zhí)行時也可能發(fā)生異常導致操作失敗,一定要將異常拋給包含事務的調(diào)用方,以免調(diào)用方以為SQL執(zhí)行成功,從而破壞了事務的一致性。

具體點說,比如上述案例中,Morty 賬戶減100 時在 update() 執(zhí)行過程中發(fā)生了未知異常,但是如果update(..) 方法內(nèi)部捕獲了異常,方法正常退出,而沒有拋給 transferAccountsTx(),那么transferAccountsTx() 就不會進入 catch() 塊并回滾事務。這也是一個需要注意的點,即,我們要保證事務中的每一處發(fā)生異常時,都可以成功回滾。

?

總結

以上是生活随笔為你收集整理的JDBC——编程式事务的实现逻辑的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 少妇又紧又色又爽又刺激视频 | 国产va在线观看 | 国产又大又粗又长 | 一区二区三区av | 亚洲一级一区 | 色呦呦 | 成人在线视频一区二区 | 国产精品免费视频一区二区三区 | 黑人多p混交群体交乱 | 在线欧美 | www.99av| 久久一区二区三区四区五区 | 在线黄色免费网站 | 国产aⅴ精品 | 欧美xxxxx自由摘花 | 美女被啪羞羞粉色视频 | 天堂资源最新在线 | 国产老熟女一区二区三区 | 国产精选久久 | 男人天堂导航 | 久久日视频 | www.色99| 一二三毛片 | 婷婷综合网站 | 九热视频在线观看 | 日韩1区 | 嫩草在线观看视频 | 91爱| 色婷婷av一区二区三区大白胸 | 欧美激情69| 色先锋在线 | 麻豆视频免费版 | 欧洲一级黄色片 | 日本三级456 | 国产视频手机在线播放 | 538国产精品一区二区 | 日本精品在线看 | 欧美男女交配视频 | caopor在线 | 久久久久久久中文字幕 | 免费日韩毛片 | 欧美大尺度床戏做爰 | 99国产精品一区二区三区 | 精品国产麻豆 | 亚洲高清毛片 | 亚洲精品视频久久 | 麻豆自拍视频 | 天堂аⅴ在线最新版在线 | 午夜精品在线 | 亚洲av色区一区二区三区 | 日韩在线播放一区二区 | 色桃网| 久久成人乱码欧美精品一区二区 | 91麻豆精品国产理伦片在线观看 | 99久久精品国产成人一区二区 | 亚洲国产精品99 | 一级黄色录相 | 毛片视频网址 | 男操女视频在线观看 | 91视频免费看 | 色偷偷综合 | 亚洲精品少妇一区二区 | 日本不卡1 | 欧美在线专区 | 美女一级视频 | 99精品视频一区二区三区 | 不卡视频在线 | 久久精品人人爽 | 国产伦精品一区二区三区免费迷 | 波多野结衣不卡视频 | 精品韩国一区二区三区 | 国产精品国色综合久久 | 亚洲av久久久噜噜噜熟女软件 | 成av人片一区二区三区久久 | 最近中文字幕在线中文高清版 | 国产视频精品久久 | 人人妻人人澡人人爽精品 | 合欢视频在线观看 | 欧美少妇网 | 久草在 | 中文字幕一级二级三级 | 农民工hdxxxx性中国 | 色播日韩 | 欧洲一级视频 | 欧美日韩一区精品 | 秋霞午夜鲁丝一区二区老狼 | 69影院在线观看 | 国产毛片91 | 国产精品老熟女视频一区二区 | 国产东北露脸精品视频 | 亚洲色欲色欲www在线观看 | 日本免费一区二区三区四区五六区 | 蜜桃视频成人在线观看 | 天天射网 | 国产精品久久国产精麻豆96堂 | 亚洲影院一区 | 夫の上司に犯波多野结衣853 | 黄久久久 | 韩国三级在线视频 |