@Transactional事务不生效的原因
1.@Transactional事务不生效的原因:
Spring事务是通过AOP实现的,所以拥有事务功能的是,接口的代理类,而非接口本身。这样在调用@Transactional标注的方法时,要区分调用方法的入口是,代理类,还是,非代理类(如接口实现类自身)
如下:
@Service("tranService")
public class TranServiceImpl implements TranService{
@Autowired
private TransMapper transMapper;
@Transactional
public void test1(Long code){
transMapper.test1Insert(code);
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void test2(String id){
transMapper.test2Insert(id);
int i = 1/0;
}
@Transactional
public void test3(Long code, String id){
test1(code);
test2(id);
}
}
//模拟调用Spring事务的方法
@Component("demo")
public class Demo {
private static Long code = 1L;
private static String id = "2";
@Autowired
private TranService tranService;//代理类
public void doDemo1(){
tranService.test1(code);//事务有效
}
public void doDemo2(){
tranService.test2(id);//事务有效
}
public void doDemo3(){
tranService.test3(code, id);//调用方法中只有test3一个事务,1、2属于自调用,没有事务切面
}
@Transactional
public void doDemo4(){//共有三个事务,doDemo4、test1、test2,由于事务传播行为的设置,test1的事务,会合并到doDemo事务中;test2的事务是独立的,test2的回滚,不会影响doDemo4的事务;
tranService.test1(code);
tranService.test2(id);
}
}
2.spring 事务特性
事务的隔离级别:是指若干个并发的事务之间的隔离程度
1. @Transactional(isolation = Isolation.READ_UNCOMMITTED):读取未提交数据(会出现脏读, 不可重复读) 基本不使用
2. @Transactional(isolation = Isolation.READ_COMMITTED):读取已提交数据(会出现不可重复读和幻读)
3. @Transactional(isolation = Isolation.REPEATABLE_READ):可重复读(会出现幻读)
4. @Transactional(isolation = Isolation.SERIALIZABLE):串行化
事务传播行为:如果在开始当前事务之前,一个事务上下文已经存在,此时有若干选项可以指定一个事务性方法的执行行为
1. TransactionDefinition.PROPAGATION_REQUIRED: 如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。这是默认值。
2. TransactionDefinition.PROPAGATION_REQUIRES_NEW: 创建一个新的事务,如果当前存在事务,则把当前事务挂起。
3. TransactionDefinition.PROPAGATION_SUPPORTS: 如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。
4. TransactionDefinition.PROPAGATION_NOT_SUPPORTED: 以非事务方式运行,如果当前存在事务,则把当前事务挂起。
5. TransactionDefinition.PROPAGATION_NEVER: 以非事务方式运行,如果当前存在事务,则抛出异常。
6. TransactionDefinition.PROPAGATION_MANDATORY: 如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。
7. TransactionDefinition.PROPAGATION_NESTED: 如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行; 如果当前没有事务,则该取值等价于TransactionDefinition.PROPAGATION_REQUIRED。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器