如何解決Spring事務注解@Transactional在類內部方法調用不生效
更新時間:2024年08月19日 10:50:11 作者:MiracleSang
這篇文章主要介紹了如何解決Spring事務注解@Transactional在類內部方法調用不生效問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
Spring事務注解@Transactional在類內部方法調用不生效
問題現象
package cn.sw.study.web.service.impl;
import cn.sw.study.web.dao.UserMapper;
import cn.sw.study.web.model.User;
import cn.sw.study.web.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Date;
/**
* 用戶業(yè)務類
*/
@Service
public class UserServiceImpl implements UserService{
@Autowired
UserMapper userMapper;
public void addInfo() {
addOne();
}
@Transactional
public void addOne() {
User record = new User();
record.setLoginName("tom");
record.setPwd("111111");
record.setMobile("13913913913");
record.setUsable(1);
record.setCreateTime(new Date());
userMapper.insertSelective(record);
int i = 1/0; // 測試事務的回滾
}
}如果從外部類直接調用addOne方法,則事務是可以正常生效的。
此時addInfo方法上沒有事務注解,addOne方法上有事務注解,運行addInfo調用addOne方法,不會產生事務,測試數據遇到異常沒有回滾。
問題原因
在默認情況下,大部分使用spring的事務都是使用代理的模式,代理實現的事務有一定的局限性:
僅有在公有方法上標記的@Transactional有效;
僅有外部方法調用過程才會被代理截獲,事務才會有效,也就是說,一個方法調用本對象的另一個方法,沒有通過代理類,事務也就無法生效。
解決辦法
手動獲取代理類之后再調用
((UserServiceImpl)AopContext.currentProxy()).addOne();
問題解決!
總結
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Java使用CompletableFuture進行非阻塞IO詳解
這篇文章主要介紹了Java使用CompletableFuture進行非阻塞IO詳解,CompletableFuture是Java中的一個類,用于支持異步編程和處理異步任務的結果,它提供了一種方便的方式來處理異步操作,并允許我們以非阻塞的方式執(zhí)行任務,需要的朋友可以參考下2023-09-09
Java并發(fā)編程之ConcurrentLinkedQueue解讀
這篇文章主要介紹了Java并發(fā)編程之ConcurrentLinkedQueue解讀,非阻塞的實現方式則可以使用循環(huán)CAS的方式來實現,而ConcurrentLinkedQueue就是juc包中自帶的經典非堵塞方式實現的工具類,需要的朋友可以參考下2023-12-12

