Spring事務失效原因詳解

2021-09-27 12:32:31 字數 3063 閱讀 7238

spring事務依賴的是資料庫的事務,在開發中如果沒有處理好,可能會遇到事務失效的情況,本文就盤點spring事務會失效的一些情況並給出解決方案。

spring事務分為宣告式事務和程式設計時事務兩種。看下宣告式事務。

使用@transactional做宣告式事務的一些說明

使用@transactional做宣告式事務的流程

通過幾個例項來解釋事務失效的問題

import lombok.extern.slf4j.slf4j;

import org.springframework.beans.factory.annotation.autowired;

import org.springframework.stereotype.service;

import org.springframework.transaction.annotation.propagation;

import org.springframework.transaction.annotation.transactional;

/** * description:

* * @author liu.qq

* @create 2019-09-29 14:16

**/@service

@slf4j

public

class

testservice

catch

(exception e)

order order =

neworder()

; order.

setorderno

("parent");

order.

settitle

("parent");

order.

setstatus(0

);order.

setamount

(100);

insert

(order);}

@transactional

(propagation = propagation.requires_new)

public

void

child()

}

執行結果:child()執行成功,parent()執行成功,child()事務失效的根本原因是動態**導致的,只有被**物件直接呼叫的方法才能被**。這裡是testservice 物件直接呼叫的,而不是其**物件。所以child()方法的執行就相當於普通的方法的執行。

解決方案1:

從aop上下文獲取本類的**物件,使用**物件執行child()。

@transactional

public

void

parent()

catch

(exception e)

order order =

neworder()

; order.

setorderno

("parent");

order.

settitle

("parent");

order.

setstatus(0

);order.

setamount

(100);

insert

(order)

;}

執行結果:child()失敗,parent()成功。

解決方案2:

從spring容器獲取被**類的**物件,使用**物件執行child()方法。

package cn.arbexpress.court.transactional;

import lombok.extern.slf4j.slf4j;

import org.springframework.aop.framework.aopcontext;

import org.springframework.beans.bean***ception;

import org.springframework.beans.factory.annotation.autowired;

import org.springframework.stereotype.service;

import org.springframework.transaction.annotation.propagation;

import org.springframework.transaction.annotation.transactional;

/** * description:

* * @author liu.qq

* @create 2019-09-29 14:16

**/@service

@slf4j

public

class

testservice

implements

@transactional

public

void

parent()

catch

(exception e)

order order =

neworder()

; order.

setorderno

("parent");

order.

settitle

("parent");

order.

setstatus(0

);order.

setamount

(100);

insert

(order);}

@transactional

(propagation = propagation.requires_new)

public

void

child()

}

Spring事務失效的8個原因

1 mysql資料庫myisam不支援事務,層面做再多也無用。2 註解 transactional作用在非public方法上。3 註解 transactional作用在public方法上,但是該類沒有被spring管理,比如沒有在類上加註解 service 4 註解 transactional作用在...

spring事務失效

遇到的問題 前端時間我在做乙個父子事務巢狀的時候,出現了子事務失效。在同類的子事務上加事務註解一直都不能建立事務,後來發現是子事務失效了。下面總結一下事務失效情況和解決經驗 事務失效有如下幾種情況 沒有transaction註解 事務沒有丟擲runtimeexception異常到方法上 方法內丟擲r...

Spring 事務失效

1.丟擲檢查異常導致事務不能正確回滾 service public class service1 2.業務方法內自己 try catch 異常導致事務不能正確回滾 service public class service2 catch filenotfoundexception e 解法2 手動設定...