今天分享一个项目中看到的小问题(以下为错误演示):
@Transactional
private Data getData(String key) {
return dao.query(key);
}
Spring 声明式事务@Transactional基于 AOP 代理。无论是 JDK 动态代理还是 CGLIB,代理对象只能拦截 public 方法 的调用。private 方法属于类内部实现,代理对象根本无权访问,因此事务注解被直接忽略。
虽然项目能正常运行,但在idea中依旧会把该处标红且此处事务不能正常使用。如果依旧想要保持 private,改用编程式事务(TransactionTemplate)或许是不错的解决方案。比如,使用TransactionTemplate:
@Service
public class DemoService {
@Autowired
private TransactionTemplate transactionTemplate;
public void doBiz() {
transactionTemplate.execute(status -> {
// 数据库操作1
dao.insert(…);
// 数据库操作2
dao.update(…);
// 如果抛出异常,自动回滚;正常则自动提交
return null;
});
}
}
不仅解决了事务和private共同使用的问题,还能精确控制事务的颗粒度以及应对需要嵌套事务的场景等等。总之,手动写代码控制事务的开始、提交、回滚,比 @Transactional 更灵活但更繁琐,通常在声明式事务无法满足需求时才去使用。
———————————————————————————————————————————
可恶哇,想水一篇被系统认定质量较低,那就再水点碎碎念吧~
之前本来想说记录一个普通本科生找工作和实习的心路历程和经历,后来发现,找工作的时候晚上还能抽点时间想想写点什么,真开始实习了,发现好像没太多精力去关注技术上的事,很多时间都在理解公司里业务。而且,来的前两周都处于类似培训期的感觉,培训期一结束,也就是第三周就被安排去北京出差了(岂可修,晚上没有用电脑的地方,一个房间三个人住,但只有一个桌子,我个新来的也不好意思霸占QAQ)。不过mentor还挺好的,人生地不熟的,晚上还有三四个小时的闲余时间,难免有点彷徨无措,走一步看一步吧。
要是晚上能用电脑就好了(怨念ing)
怎么还是质量较低(可恶,这东西到底怎么消除,低就低吧,估计没人愿意看我的碎碎念)




