spring事务与异常的关系

 

 

异常类

父类

说明

类型

ReflectiveOperationException

Exception

检查性异常父类

检查性异常

ClassNotFoundException

ReflectiveOperationException

找不到类信息

检查性异常

IllegalAccessException

ReflectiveOperationException

反射操作相关的异常。 由于反射的特殊性,类、方法、属性均使用String作为名称进行操作

检查性异常

InstantiationException

ReflectiveOperationException

实例化异常。该异常继承于ReflectiveOperationException。 当试图通过newInstance()方法创建某个类的实例,而该类是一个抽象类或接口时,抛出该异常

检查性异常

InvocationTargetException

ReflectiveOperationException

调用method.invoke() 反射异常

检查性异常

NoSuchFieldException

ReflectiveOperationException

字段未找到异常

检查性异常

NoSuchMethodException

ReflectiveOperationException

方法未找到异常

检查性异常

ReflectiveOperationException

ReflectiveOperationException

反射操作异常

检查性异常

异常类

父类

说明

类型

NullPointException

Exception

检查性异常父类

运行时异常

spring事务传播类型

 

事务传播行为类型

说明

PROPAGATION_REQUIRED

如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。

 

PROPAGATION_SUPPORTS

支持当前事务,如果当前没有事务,就以非事务方式执行。

PROPAGATION_MANDATORY

使用当前的事务,如果当前没有事务,就抛出异常。

PROPAGATION_REQUIRES_NEW

新建事务,如果当前存在事务,把当前事务挂起。

PROPAGATION_NOT_SUPPORTED

以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。

PROPAGATION_NEVER

以非事务方式执行,如果当前存在事务,则抛出异常。

PROPAGATION_NESTED

如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。

 

 

 

 

 

事务和异常关系

事务

异常类型

异常处理

是否回滚

代码示例

有事务

 

检查性异常

抛出事务中不指定异常类

N

@Transactional

public void saveAndCheckedException(UserInfo userInfo) throws ClassNotFoundException {

        String sql="insert into tb_user_info (`user_name`) values('"+userInfo.getName()+"')";

        jdbcTemplate.execute(sql);

        Class.forName("com.jdbc.driver.MysqlDriver11");//测试异常

    }

 

 

检查性异常

抛出在事务中指定异常类

Y

  @Transactional(rollbackFor = ClassNotFoundException.class)

    public void saveAndCheckedException1(UserInfo userInfo) throws ClassNotFoundException {

        String sql="insert into tb_user_info (`user_name`) values('"+userInfo.getName()+"')";

        jdbcTemplate.execute(sql);

        Class.forName("com.jdbc.driver.MysqlDriver11");//测试异常

    }

 

检查性异常

抛出在事务中指定别的异常类

N

    @Transactional(rollbackFor = NullPointerException.class)

    public void saveAndCheckedException2(UserInfo userInfo) throws ClassNotFoundException {

        String sql="insert into tb_user_info (`user_name`) values('"+userInfo.getName()+"')";

        jdbcTemplate.execute(sql);

        Class.forName("com.jdbc.driver.MysqlDriver11");//测试异常

    }

 

检查性异常

抛出在事务中指定该异常的父类

Y

@Transactional(rollbackFor = ReflectiveOperationException.class)

    public void saveAndCheckedException3(UserInfo userInfo) throws ClassNotFoundException {

        String sql="insert into tb_user_info (`user_name`) values('"+userInfo.getName()+"')";

        jdbcTemplate.execute(sql);

        Class.forName("com.jdbc.driver.MysqlDriver11");//测试异常

    }

 

 

检查性异常

捕捉异常

N

  @Transactional

    public void saveAndCheckedException4(UserInfo userInfo) {

        String sql="insert into tb_user_info (`user_name`) values('"+userInfo.getName()+"')";

        jdbcTemplate.execute(sql);

        try {

            Class.forName("com.jdbc.driver.MysqlDriver11");//测试异常

        } catch (ClassNotFoundException e) {

            e.printStackTrace();

        }

    }

 

运行时异常

抛出并且不指定异常类

Y

  /**

     * 运行时异常 事务回滚!

     * @param userInfo

     */

    @Transactional

    public void saveAndUnChecked(UserInfo userInfo){

        String sql="insert into tb_user_info (`user_name`) values('"+userInfo.getName()+"')";

        jdbcTemplate.execute(sql);

        //空指针异常

        UserInfo userInfo1=null;

        userInfo1.getName();

    }

 

运行时异常

捕捉异常

N

  /**

     * try 事务不回滚

     * @param userInfo

     */

    @Transactional

    public void saveAndUnChecked1(UserInfo userInfo){

        String sql="insert into tb_user_info (`user_name`) values('"+userInfo.getName()+"')";

        jdbcTemplate.execute(sql);

        try {

            //空指针异常

            UserInfo userInfo1 = null;

            userInfo1.getName();

        }catch (NullPointerException e){

            e.printStackTrace();

        }

    }

 

运行时异常

抛出异常

Y

   /**

     * 抛出但是不指定对应回滚异常类 事务回滚

     * @param userInfo

     */

    @Transactional

    public void saveAndUnChecked2(UserInfo userInfo) throws  NullPointerException{

        String sql="insert into tb_user_info (`user_name`) values('"+userInfo.getName()+"')";

        jdbcTemplate.execute(sql);

            //空指针异常

            UserInfo userInfo1 = null;

            userInfo1.getName();

    }

 

 

运行时异常

抛出异常并在事务中声明其它运行时异常

Y

 

    /**

     * 抛出并指定回滚异常类(类不同),并throw 可能的异常 事务回滚

     * @param userInfo

     */

    @Transactional(rollbackFor = ArithmeticException.class)//算数运算异常

    public void saveAndUnChecked3(UserInfo userInfo) throws  NullPointerException{

        String sql="insert into tb_user_info (`user_name`) values('"+userInfo.getName()+"')";

        jdbcTemplate.execute(sql);

        //空指针异常

        UserInfo userInfo1 = null;

        userInfo1.getName();

    }

 

运行时异常

不抛出可能异常,在事务中指定其它异常

Y

/**

     * 抛出并指定回滚异常类(类不同),不throw 可能的异常 事务回滚

     * @param userInfo

     */

    @Transactional(rollbackFor = ArithmeticException.class)//算数运算异常

    public void saveAndUnChecked4(UserInfo userInfo) {

        String sql="insert into tb_user_info (`user_name`) values('"+userInfo.getName()+"')";

        jdbcTemplate.execute(sql);

        //空指针异常

        UserInfo userInfo1 = null;

        userInfo1.getName();

    }

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值