事務邊界問題

2021-07-08 17:06:05 字數 1034 閱讀 7622

事務邊界問題 

我們先回顧一下我們現在寫的**: 

可以看到我們現在寫的**是dao層中每乙個方法都有乙個事務包圍著. 

我們現在以銀行同行轉帳為例 

因為dao層只涉及到與資料庫的互動,所以轉帳這個方法應該是在服務層,那麼這個時候我們在服務層有乙個轉帳的方法供我們呼叫. 

可以看到程式結構的情況如下: 

dao層: 

service層: 

我們可以看到現在在服務層中的轉帳方法需要呼叫dao層的兩個方法,但是請注意,dao層的兩個方法,每個方法都有事務包圍.如果帳戶減減呼叫成功, 帳戶++的方法呼叫出錯,回滾了,請問帳戶減減這個方法會回滾嗎? 

肯定不會,那麼這個時候就會出現錢不見了的問題了? 

這個時候的解決方案是將事務的開始與提交移到服務層,那這個時候就可以解決這個問題 

這種解決方法叫opensessioninview模式,因為我們現在還沒有學到spring,不能給服務層的方法進行攔截過濾,但是我們可以給sevlet進行過濾,利用過濾器的功能. 

看一下結構圖 

使用getcurrentsession()來獲取session在hibernate.cfg.xml中必須配置乙個開關 

thread

此開關的配置值有兩個: thread, jta 

那麼jta什麼時候用呢?現在只理解即可,不需要掌握. 

我們以跨行轉帳為例子 

我們知道招行和工行不可能是同乙個資料庫,這個時候跨行轉帳方法中的事務就得維護兩個資料庫之間的資料同步,這個時候就涉及到分布式的處理,也叫分布式的事務,那麼這個時候就得設定為jta了, jta叫分布式事務管理, tomcat不支援分布式事務的功能, 只有大型的收費的web應用伺服器才支援分布式的事務管理,如weblogic,websharp…在這裡我們只做一下簡單的了解即可. 

再回頭看上面的問題,當我們將session的事務開始與事務結束放大到了action的範圍,並且getcurrentsession()又能夠保證我們在乙個執行緒內操作的是乙個session,那這個時候,在web環境下,我們就可以解決我們懶載入(lazy)的問題了. 

陣列邊界問題

先來看一段程式吧,在程式中講問題 include int prime int x int main while i 301 for i 0 i 300 i for i 0 i 300 i if 1898 sum return0 int prime int x if 2 count else for ...

mysql between and 邊界問題

以此表為例 between and 普通數值左右邊界都包括 between and 日期數值只包括左邊界不包括右邊界 我們檢視全部的資料的時候發現2020 06 12是有資料的,但是直接通過between and卻沒有查出來。原因在於它認為這條sql語句的時間是 開始日期從2020 1 12 00 ...

小談邊界問題

邊界問題主要有兩種,動態關係的,還有就是靜態關係的.第一類是有一定對稱性的幾何圖形,比如說列印倒三角形或者菱形等.這種題目一般思路就是找出圖形的特點 對稱性等 與迴圈變數 行號,列號 之間的關係.我們可以假設行用i表示,列用j表示.我們的目的就是找出i,j與圖形之間的對應關係.按圖形形狀的不同,複雜...