Spring事务管理,"'程序报错'但'事务不回滚'?"问题分析(SSM实例)

ps.本文仅是个人的学习总结,如果有错误/遗漏/不严谨的地方,希望大家可以不吝指正,在这里我先谢谢了.

就我现在遇见的坑来说,’报错不回滚’有两个原因:
1.不清楚什么样的报错才会回滚(理解错误).
2.配置文件错误或者不完整(配置错误).

1.理解错误

这里我举两个例子,来更清晰的表述我的观点.

//假设配置等一系列前提条件都没有错误
@Transactional
public void demo1(User user) throws Exception {
    userDao.write(user);
    userDao.read(user);
}
@Transactional
public void demo2(User user) throws Exception {
    userDao.write(user);
    int i = 1/0;
    userDao.read(user);
}

demo1,java代码并没有问题,但是write()/read()操作异常
demo2,java代码出现问题,假设write()/read()操作没有问题

很多朋友是demo1这种情况,java代码并没有问题,但是由于数据库操作不当(如:sql语句错误等),出现报错.
以我过的坑的情况来说,若是java没有出现错误,而是你个人的sql语句出现错误,事务是不会回滚的.
!简单来说就是
若java语句有问题,程序报错,事务可以回滚;
若后台数据库操作不当(如:sql语句本身编写错误),这种情况引发的报错,事务是不会回滚的;

若理解比较模糊的话,我打个可能不那么恰当的比方,
Spring事务管理就是银行操作管理,java代码就是银行内部操作,数据库操作就是你个人对你财务操作
银行操作管理只能在银行内管理事务,而你个人对财务的操作,已经延伸到了你私生活.
你要是取钱存钱,有银行操作管理为你保驾护航,若是银行内部操作错误,问题都不会波及到你的钱(大不了回滚事务,没发生一样)
但是,银行内部操作没出错,你自己对你的财务操作(如:赌博等),一不小心败光了,银行是不会给你回滚的,哪有这么好的事.


ps.可在java代码适当的位置加上”int i=1/0”试试看,进而判断你的配置有没有出现问题.

2.配置错误

基于注解配置的声明式的事务,应该对大家来说是最省事、更容易接受吸收的方式了.

这里我列出配置文件与使用方法(仅供参考学习)
(由于我是SSM框架,这里我就不过多修改了,怕有朋友就是需要这个,若是仅用Spring的话,请自行删改)
(该配置文件都是自动扫描,只要配置文件路径正确,不用单独去配置哪个service或者dao的文件等)

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:context</
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值