传播级别NESTED的作用是在当前方法调用子方法时,如果子方法发生异常,只回滚子方法执行过的SQL,而不回滚当前方法的事务 。
那该传播级别是怎么做到只回滚子方法执行过的SQL,而不回滚当前方法的事务的呢?
大部分的数据库,可以在一段sql语句中设置一个标志位,如果后面的代码执行出现了异常,那么也只会把数据回滚到这个标志位所对应的数据状态,然后就不会再回滚了,所以在标志位之前对数据做的操作还会保留着。该标志位在数据库的概念被称为保存点,但是不是所有的数据库都支持保存点技术,所以当数据库不能支持保存点技术时,Spring就会新建一个事务去运行代码,这样就做到了事务隔离,子方法有子方法的事务,当前方法有当前方法的事务,出现问题时,也只会根据自己当前的事务做回滚操作。