羅列一下spring事務的一些坑

2022-08-09 17:18:15 字數 2886 閱讀 1299

首先,我們先明白spring事務的本質其實就是資料庫對事務的支援,沒有資料庫的事務支援,spring是無法提供事務功能的。那麼,我們一般使用jdbc操作事務的時候,**如下

使用spring事務管理後,我們可以省略步驟(2)和步驟(4),就是讓aop幫你去做這些工作。關鍵類在transactionaspectsupport這個切面裡,大家有興趣自己去翻。

首先,我們要明白spring事務回滾機制是這樣的:當所攔截的方法有指定異常丟擲,事務才會自動進行回滾!因此,如果你默默的吞掉異常,像下面這樣

@service

public

class

userservice catch}}

那切面捕捉不到異常,肯定是不會回滾的。還有就是,預設配置下,事務只會對error與runtimeexception及其子類這些異常,做出回滾。一般的exception這些checked異常不會發生回滾(如果一般exception想回滾要做出配置),如下所示:

@transactional(rollbackfor = exception.class)
ps:經典老題啊!!其出現頻率,不下於hashmap的出現頻率!該問題有很多問法,例如spring事務有哪些坑?你用spring事務的時候,有遇到過什麼問題麼?其實答案都一樣的,ok,不羅嗦了,開始答案!

我們知道spring事務的原理是aop,進行了切面增強,那麼失效的根本原因是這個aop不起作用了!常見情況有如下幾種:

(1)發生自呼叫

例如**如下:

@service

public

class

userservice

@transactional

public

void

updateuser(user user)

}

此時是無效的,因此上面的**等同於

@service

public

class

userservice

@transactional

public

void

updateuser(user user)

}

此時這個this物件不是**類,而是userservice物件本身!

解決方法很簡單,讓那個this變成userservice的**類即可,就不展開說明了!

(2)方法不是public的

ok,我這裡不想舉原始碼。大家想乙個邏輯就行!

@transactional註解的方法都是被外部其他類呼叫才有效!

如果方法修飾符是private的,這個方法能被外部其他類調到麼?

既然調不到,事務生效有意義麼?

想通這套邏輯就行了~~

記住:@transactional 註解只能應用到 public 可見度的方法上。如果你在 protected、private 或者 package-visible 的方法上使用 @transactional 註解,它也不會報錯, 但是這個被註解的方法將不會有事務行為。

(3)發生了錯誤異常

這個問題在第二問講過了,因為預設回滾的是:runtimeexception。如果是其他異常想要回滾,需要在@transactional註解上加rollbackfor屬性。

又或者是異常被吞了,事務也會失效,不贅述!

(4)資料庫不支援事務畢竟spring事務用的是資料庫的事務,如果資料庫不支援事務,那spring事務肯定是無法生效的!

ok,是一回事!我們先明確一點,資料庫一般有四種隔離級別資料庫有四種隔離級別分別為

我資料庫的配置隔離級別是read commited,而spring配置的隔離級別是repeatable read,請問這時隔離級別是以哪乙個為準?

ok,以spring配置的為準。jdbc有乙個介面是這樣的

void settransactionisolation(int level) throws sqlexception;
該介面用來設定事務的隔離級別。那麼在

datasourceutils中,有一段**是這樣的

他的意思就是,如果spring定義的隔離級別和資料庫的不一樣,則以spring定義的為準。另外,如果spring設定的隔離級別資料庫不支援,效果取決於資料庫。

此題考查的是spring的事務傳播行為我們都知道,預設的傳播行為是propagation_required,如果外層有事務,則當前事務加入到外層事務,一塊提交,一塊回滾。如果外層沒有事務,新建乙個事務執行!也就是說,預設情況下只有乙個事務!

這道題很多種問法,例如spring 是如何保證事務獲取同乙個connection的?ok,開始我們的講解!其實答案只有一句話,因為那個connection在事務開始時封裝在了threadlocal裡,後面事務執行過程中,都是從threadlocal中取的,肯定能保證唯一,因為都是在乙個執行緒中執行的!至於**。。。以jdbctemplate的execute方法為例,看看下面那張圖就懂了。

Spring事務的一些特性

1.原子性 乙個事務中所有對資料庫的操作是乙個不可分割的操作序列,要麼全做要麼全不做 2.一致性 資料不會因為事務的執行而遭到破壞 3.隔離性 乙個事物的執行,不受其他事務的干擾,即併發執行的事物之間互不干擾 4.永續性 乙個事物一旦提交,它對資料庫的改變就是永久的 1.default 預設的事務隔...

Spring事務的一些特性

1.原子性 乙個事務中所有對資料庫的操作是乙個不可分割的操作序列,要麼全做要麼全不做 2.一致性 資料不會因為事務的執行而遭到破壞 3.隔離性 乙個事物的執行,不受其他事務的干擾,即併發執行的事物之間互不干擾 4.永續性 乙個事物一旦提交,它對資料庫的改變就是永久的 1.default 預設的事務隔...

nmap引數詳解(羅列一下)

內容不太工整 il 指定檔案 ir 100 p22 隨機選擇目標100個 的22埠 nmap 192.168.0.0 24 exclude 192.168.0.1 100 不掃瞄後面的部分 sl 列出ip 相當於子網掩碼的計算 sn 只ping pn 防止 如果沒有回包就不進行了 ps pa pu ...