分層架構下的純JDBC事務控制簡單解決方案
對目前的JavaEE企業應用開發來說,基本都會採用分層的架構, 這樣可以分散關注、鬆散耦合、邏輯複用、標準定義。例如,目前使用SSH組合時典型的四層架構:表示層、業務層、持久層和資料層;那麼,在四層架構中,事務的控制應該放在哪一層呢?
如果使用Spring框架,它對事務做了很好的封裝,通過它的AOP配置,可以靈活的配置在任何一層;但是在很多的需求和應用,直接使用JDBC事務控制還是有其優勢的。所以,本文來討論純JDBC事務的控制問題。
其實,事務是以業務邏輯為基礎的;一個完整的業務應該對應業務層裡的一個方法;如果業務操作失敗,則整個事務回滾;所以,事務控制是絕對應該放在業務層的;但是,持久層的設計應該遵循一個很重要的原則:持久層應該保證操作的原子性,就是說持久層裡的每個方法都應該是不可以分割的。
例如針對一個部門和員工的CRUD操作。如果要刪除某個部門,就應該在DeptDao中有一個刪除部門的方法:
public class DeptDao {
public void deleteDept(int id) ; //刪除指定ID的部門
}
在EmpDao中有一個刪除指定部門下的所有員工的方法
public interface EmpDao{
public void deleteEmpByDeptId(int id); //刪除指定部門下的所有員工
}
這樣,就應該在業務層DeptService中的刪除部門方法中組合這兩個方法,即把它們放置在同一個事務中:
public class DeptService{
public void deleteDept(int id){
try{
//啟動JDBC事務
//呼叫EmpDao中的deleteEmpByDeptId(id)方法
//呼叫DeptDao中的deleteDept(id)方法
//操作正常,提交事務
}catch(Exception e){
//異常,回滾事務
}
}
}
要讓這兩個Dao操作在同一個事務,最主要的一點就是:啟動JDBC事務中使用的資料庫連線和兩個Dao操作方法裡獲得的資料庫連線要是同一個連線。參照Spring的JDBC事務原理,可以使用ThreadLocal類, 在啟動JDBC事務中把資料庫連線繫結到執行緒,以保證在同一個執行緒下獲得的都是同一個連線。這樣就達到目的了。
如下資料庫工具類:
如下事務管理器類:
如下業務層類:
具體的示例程式碼結構如下(Eclipse工程):
如有需要,留下郵箱。
相關推薦
分層架構下的純JDBC事務控制簡單解決方案
對目前的JavaEE企業應用開發來說,基本都會採用分層的架構, 這樣可以分散關注、鬆散耦合、邏輯複用、標準定義。例如,目前使用SSH組合時典型的四層架構:表示層、業務層、持久層和資料層;那麼,在四層架構中,事務的控制應該放在哪一層呢? 如果使用Spring框架,它對事務
微服務架構下處理分散式事務,你必須知道的事兒
根據微服務架構的鼻祖 Martin Fowler 的忠告,微服務架構中應當儘量避免分散式事務。然而,在某些領域,分散式事務如同宿命中的對手無法避免。 在工程領域,分散式事務的討論主要聚焦於強一致性和最終一致性的解決方案。 典型方案包括: 兩階段提交(2PC, Two-phase Commit)方案
Spring的Jdbc,事務及簡單實現
一.spring 整合 jdbc 基本的專案目錄: 首先要加入的pom.xml配置,也就是引入的依賴,程式碼如下: <!-- spring 測試環境 --> <dependency> <groupId>o
【分散式事務】微服務架構下的分散式事務問題
ACID理論:關係型資料庫的事務滿足 ACID 的特性,具有 ACID 特性的資料庫支援資料的強一致性,保證了資料本身不會出現不一致。適用於傳統的單體架構。 CAP理論:在分散式系統下, 包含三個要素:Consistency(一致性)、Availability(可用性)、Partition toleranc
一種在ssm框架下時間互動的簡單解決方案
總結基於ssm框架下的統一快速處理時間的簡單方案。 1 約定與頁面互動格式 後臺程式為前端頁面提供介面,統一使用時間字串互動:包含兩種字串格式:"yyyy-MM-dd HH:mm:ss"和"yyy
用VS新建多層架構時引用第三方dll 時清理解決方案時,放bin資料夾下的bll被清空問題
今天新建一個新的專案時,引用了多個第三方的dll,每次一清空解決方案重新生成,dll就被清空,導致專案報錯,整個解決方案的dll都沒生成,so 看起來很嚴重。後來搜了下,說第三方的dll檔案不能放bin 檔案中,新建一個資料夾用來存放dll,檔案。另外也注意下引
分散式叢集環境下Session共享的簡單解決方案
關於Cookie和Session的功能與工作原理,在這裡我就不再敘述了,大家想要了解可以看一下我的上一篇部落格,講的還是很細緻的。 但是之前講的Session是執行在一臺伺服器上的,所有的訪問都會到達我們的唯一伺服器上,這樣我們可以根據客戶端傳來的sessionID,來獲取
Spring的Service調用本類方法聲明式事務無效的解決方案
{} 解決 ostc oid color wire ont spa 出了 示例: class Test{ public void a(){ b(); } @Transactional pubic void b(){} }
Mac 下 Chrome 瀏覽器 ERR_NETWORK_CHANGED 報錯解決方案
chan 安全 方案 pan chrom remove 由於 pat net 一直以為是 SwitchyOmega 和 SpechtLite 的問題,原來是支付寶安全控件。 由於支付寶現在已經不需要 Mac 安全控件機制,所以可以通過在 terminal 運行以下命令來移
【ansible】Windows開啟遠程控制錯誤解決方案:無法檢查防火墻狀態
contain ret turn nbsp windows wall 解決方案 itl wrapper 這個在老版本的Windows系統才有這種bug。例如Windows 2008 R2和Windows 7,如果你的系統的阿裏雲的Windows server 2
Dev-c++在windows環境下無法debug(調試)的解決方案
命令 但是 call debug debugging 我們 技術分享 mpi 上下 如標題所見,在官網上下載的最新版本的Dev-C++居然無法調試,這是何等煩人,有些時候我們為了更加了解一下代碼中遞歸部分的變化情況,debug功能舉足輕重。 在本人的windows環境下
KafkaManager中Group下不顯示對應Topic的解決方案
consumer image 正常 圖片 set pre sets bubuko 問題 一、軟件版本 Kafka:0.8.2.1 KafkaManager:1.2.9.10 二、問題現象 點擊Consumer下某個組,顯示如下圖所示的異常: 查看Kafk
java分布式事務,及解決方案
ted 即使 線下 提升 nts 20px lan term 不能 1、什麽是分布式事務 分布式事務就是指事務的參與者、支持事務的服務器、資源服務器以及事務管理器分別位於不同的分布式系統的不同節點之上。以上是百度百科的解釋,簡單的說,就是一次大的操作由不同的小操作組成,這些
通過js添加的DOM節點的click事件綁定不上的解決方案以及IOS下click事件委派失效的解決方案
之前 obj cli 並且 create 使用 引入 gpo 聲明 問題描述: 如以下代碼所示,通過js添加的Dom節點,在其上綁定點擊事件,有的時候會出現點擊事件不響應的情況,按照正常的理解,js代碼具有阻塞性,Dom節點添加成功之後,就可以找到該節點並綁定事件,沒有道理
ubuntu下pip3 install 模塊緩慢解決方案
simple pan gpo highlight clas ins .cn sin light 解決方案: SegmentFault:https://segmentfault.com/q/1010000000162410 pip install -i https://
ASP.NET多線程下使用HttpContext.Current為null解決方案
sdn lower null com 獲取文件 .html 模擬 public 一個 問題一:多線程下獲取文件絕對路徑 問題一:多線程下獲取文件絕對路徑 當我們使用HttpContext.Current.Server.MapPath(strPath)獲取絕對路徑時H
windows下安裝torchvision報錯的解決方案
環境 低版本 圖片 whl import cond dll 分享圖片 錯誤信息 今晚再次多次嘗試在win10下安裝pytorch以及torchvision,終於把上次的坑給填了。來來回回裝卸各種包有幾十遍了,稍微記錄一下,給後面遇到同樣問題的人一點提醒。 首先,介紹下安裝流
高並發下接口冪等性解決方案
困難 不同 同時 ont set 參數 交付 任務 數量 一、冪等性概念 在編程中.一個冪等操作的特點是其任意多次執行所產生的影響均與一次執行的影響相同。冪等函數,或冪等方法,是指可以使用相同參數重復執行,並能獲得相同結果的函數。這些函數不會影響系統狀態,也不用擔心重復執行
Hibernate映射數據庫中longtext類型屬性時報錯No Dialect mapping for JDBC type: -1的解決方案
ping arch jdbc .sql xml配置 nbsp ava col 類型 出現錯誤的原因是:hibernate中對於數據庫的longtext數據類型不支持。 解決方案: 1、寫個類集成方言,然後自己實現對longtext的支持 1 import java.sql
ScrollView下,ListView重複呼叫getview解決方案
首先講一下我遇到的需求吧,頁面是這樣的,上邊有東西,中間是列表,下邊還有東西。首先我看到列表立刻就想到了用ListView,但是頁面有限,只能用ScrollView包一下。想到就做唄。我就在ScrollView裡面加了一個ListView, ListView設定的是wapcontent,這樣就出現