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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

java service 事物_Service 事务(JdbcUtils 升级)

發布時間:2025/3/12 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java service 事物_Service 事务(JdbcUtils 升级) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. DAO 事務

// 在 DAO 中處理事務真是"小菜一碟"

public void xxx(){

Connection con = null;

try{

con = JdbcUtils.getConnection();

con.setAutoCommit(false); // 開啟事務

QueryRunner qr = new QueryRunner();

String sql = ...;

Object[] params = ...;

qr.update(con,sql,params);

sql = ...;

Object[] params = ...;

qr.update(con,sql,params);

con.commit(); // 提交事務

} catch(Exception e){

try{

// 回滾事務

if(con != null) {con.rollback();}

}catch(Exception e){}

}finally{

try{

con.close();

}catch(Exception e){}

}

}

2. Service 才是處理事務的地方

DAO 中不是處理事務的地方,因為 DAO 中的每個方法都是對數據庫的一次操作, 而 Service 中的方法才是

對應一個業務邏輯,也就是我們需要在 Service 中的一方法中調用 DAO 的多個方法,而這些方法應該在一個

事務中.

// 事務需要保證為同一個 Connection

// 可以通過向 DAO 中傳遞 Connection, 來保證 DAO 的多個方法使用相同的 Connection

public class XXXService(){

private XXXDao dao = new XXXDao();

public void serviceMethod(){

// 但是 Connection 對象只能出現在 DAO 中, 因為它是 JDBC 的東西,

// JDBC 的東西是用來連接數據庫的, 連接數據庫是由 DAO負責, 而事務卻

// 應該由 Service 負責.

Connection con = null;

try{

con = JdbcUtils.getConnection();

con.setAutoCommit(false);

// 向 DAO 中傳遞 Connection

dao.daoMethod2(con,...);

dao.datMethod3(con,...);

con.commit();

}catch(Exception e){

try{

con.rollback();

} catch(Exception e){}

}finally{

try{

con.close();

}catch(Exception e){}

}

}

}

3. 修改 JdbcUtils

把對事物的開啟和關閉放到 JdbcUtils 中,在 Service 中調用 JdbcUtils 的方法來完成事務的處理,

但在 Service 中就不會再出現 Connection 了.

DAO 中的方法不用再讓 Service 來傳遞 Connection 了, DAO 會主動從 JdbcUtils 中獲取 Connection

對象, 這樣, JdbcUtils 成為了 DAO 和 Service 的中介!

// Service 中的代碼

public class XXXService(){

private XXXDao dao = new XXXDao();

public void serviceMethod(){

try{

JdbcUtils.beginTransaction();

dao.daoMethod2();

dao.daoMethod3();

JdbcUtils.commitTransaction();

}catch(Exception e){

JdbcUtils.rollbackTransaction();

}

}

}

// JdbcUtils 代碼

public class JdbcUtils{

private static ComboPooledDataSource dataSource = new ComboPooledDataSource();

// 它是事務專用連接, 并且每個線程分配一個Connection

private static ThreadLocal tl = new ThreadLocal();

public static Connection getConnection() throws SQLException{

Connection con = tl.get(); // 獲取當前線程的 con

// 當 con 不等于 null, 說明已經調用過 beginTransaction() 方法了.表示開啟了事務.

if(con != null) return con;

return dataSource.getConnection();

}

public static DataSource getDataSource(){

return dataSource();

}

// 添加開啟事務的方法

// 獲取一個 Connection, 設置它的 setAutoCommit(false)

// 還要保證 DAO 中使用的連接是我們剛剛創建的!!

/*

* 1. 創建一個 Connection, 設置為手動提交

* 2. 把這個 Connection 給 DAO 用!

* 3. 還要讓 commitTransaction 或 rollbackTransaction 可以獲取到!!

*/

public static void beginTransaction() throws SQLException {

Connection con = tl.get();

if(con != null) throw new SQLException("已經開啟了事務,就不要重復開啟了!");

con = getConnection(); // 給 con 賦值, 表示事務已經開啟了.

con.setAutoCommit(false);

tl.set(con); // 把當前線程的連接保存起來.

}

// 添加提交事務的方法

// 獲取 beginTransaction 提供的 Connection, 然后調用 commit 方法

public static void commitTransaction() throws SQLException {

Connection con = tl.get(); // 獲取當前線程的專用連接

if(con == null) throw new SQLException("還沒有開啟事務,不能提交!");

con.commit();

con.close();

// 把它設置為 null, 表示事務已經結束了.

// 下次再去調用 getconnection(),返回的就不是 con 了.

// con = null; 因為有了線程, 所以將 con 直接從線程中移除即可

tl.remove(); // 從 tl 中移除連接

}

// 添加回滾事務的方法

// 獲取 beginTransaction 提供的 Connection, 然后調用 rollback 方法.

public static void rollbackTransaction() throws SQLException {

Connection con = tl.get(); // 獲取當前線程的專用連接

if(con == null) throw new SQLException("還沒有開啟事務,不能回滾!");

con.rollback();

con.close();

tl.remove();

}

// 釋放連接

public static void releaseConnection(Connection con) throws SQLException{

Connection con = tl.get(); // 獲取線程中的事務

// 判斷 connection 是不是事務專用, 如果是, 就不關閉

// 如果不是事務專用, 那么就要關閉

// con 是事務專用連接, 如果 con 為 null,表示沒有事務.

// 那么, connection 肯定不是事務專用的.

if(con == null) connection.close();

// 如果 con != null, 說明有事務,那么需要判斷參數連接是否與 con 相等,

// 如果不相等, 說明 connection 不是事務專用連接.

if(con != connection) connection.close();

}

}

// DAO 層代碼

public class AccountDao{

public void update(String name, double money) throws SQLException{

QueryRunner qr = new QueryRunner();

String sql = "UPDATE account SET balance=balance+? WHERE name=?";

Object[] params = {money,name};

// 我們需要自己來提供連接, 保證在同一事務中, 多次調用使用的是同一個連接!!

Connection con = JdbcUtils.getConnection();

qr.update(con,sql,params);

// 關閉連接

JdbcUtils.releaseConnection(connection);

}

}

參考資料:

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的java service 事物_Service 事务(JdbcUtils 升级)的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 亚洲永久在线观看 | 亚洲av电影一区二区 | 欧美日韩日本国产 | www.久久国产 | 四虎精品在线观看 | 日韩成人一区二区 | 日日cao| 99人妻少妇精品视频一区 | 亚洲精华液一区二区 | 成年人午夜免费视频 | 尤物在线精品 | 91久久久久久久久久久 | 黄色的视频网站 | 五月婷婷丁香综合 | 成人1区2区3区 | 香蕉视频一区 | 在线观看免费日韩av | 欧美在线免费 | 午夜秋霞 | 日韩色综合网 | 福利片在线看 | 五月婷婷综合激情网 | 亚洲AV无码成人精品国产一区 | 大波大乳videos巨大 | 午夜免费一级片 | 欧美一区二区三区成人精品 | 亚洲人在线观看视频 | 三级在线观看 | 波多野结衣一区二区三区高清av | 国产精品爽 | 在线日本中文字幕 | 黄色小说视频网站 | 免费搞黄网站 | 成人在线视频免费播放 | 欧美爽爽爽 | 国产黄色高清视频 | 亚洲观看黄色网 | 久久国产精品99久久人人澡 | av每日更新在线观看 | 日韩aaa| 中文字幕日韩三级 | 黄色免费网站视频 | 久久国产精品首页 | 天堂俺去俺来也www久久婷婷 | 日本精品一二区 | 精品国产一区二区三区久久久蜜月 | 日韩经典一区 | 成人三级影院 | 日韩一区二区三区四区在线 | 四虎精品| 少妇捆绑紧缚av | 红色假期黑色婚礼2 | 性www| 四虎黄网| 国产精品无码av在线有声小说 | 国产精品欧美激情 | 一区二区三区在线播放视频 | 国产成人自拍视频在线 | 精品熟女一区二区三区 | 国产在线观看一区二区三区 | 黄色一级一片免费播放 | 日本色呦呦 | 人妻少妇久久中文字幕 | 九七精品 | 亚洲在线资源 | 欧美在线观看不卡 | 91色呦呦| 男女激情啪啪 | 欧美69视频 | 成人一级片在线观看 | 国产黄在线 | 2024av视频| 国产一区二区在线电影 | 华人色 | www.色播.com | 日本国产高清 | 丁香九月婷婷 | 在线播放黄色网址 | 一区二区不卡免费视频 | japan高清日本乱xxxxx | 亚洲爽爆 | 国产一级片播放 | 亚洲成人av电影 | 欧美性受xxxxxx黑人xyx性爽 | 91丨porny丨国产 | 久久精品性爱视频 | 久久久久久久久97 | 国产精品有限公司 | 国产床上视频 | 爱爱高潮视频 | 欧美日韩国产麻豆 | 韩国成年人网站 | 99精品在线播放 | 99色这里只有精品 | 亚洲av无码不卡一区二区三区 | av大全网站 | 亚洲欲妇| 成人午夜免费观看 | 瑟瑟综合网 |