为什么JDBCTEmplate.batchupdate(sql[])方法不在Spring4中使用@transaction注释回滚?

为什么JDBCTEmplate.batchupdate(sql[])方法不在Spring4中使用@transaction注释回滚?,spring,spring-transactions,Spring,Spring Transactions,当在数据库中插入记录时发生任何异常时,下面的代码不适用于回滚。我使用的是Spring 4框架和注释 */我使用下面的代码进行事务管理,它不会因任何异常而回滚/ @Transactional(rollboor=RuntimeException.class) 公共布尔insertBatch(列表查询)引发SQLException{ 布尔标志=假; 尝试 { JdbcTemplate JdbcTemplate=新的JdbcTemplate(数据源); String[]Sql=query.toArray

当在数据库中插入记录时发生任何异常时,下面的代码不适用于回滚。我使用的是Spring 4框架和注释

*/我使用下面的代码进行事务管理,它不会因任何异常而回滚/

@Transactional(rollboor=RuntimeException.class)
公共布尔insertBatch(列表查询)引发SQLException{
布尔标志=假;
尝试
{
JdbcTemplate JdbcTemplate=新的JdbcTemplate(数据源);
String[]Sql=query.toArray(新字符串[query.size()]);
jdbcTemplate.batchUpdate(Sql);
flag=true;
}捕获(数据访问异常)
{
flag=false;
MessageResource.setMessages(“约束冲突!CSV数据值与数据库约束不匹配”);
LOGGER.info(“对于相同的数据值,CSV文件数据不应作为数据库表结构定义,如约束冲突/数据类型长度/NUll等”);
LOGGER.error(“错误原因:+e.getRootCause().getMessage());
debug(“详细说明:+e.toString());
抛出新的运行时异常(“回滚操作”);
//transactionManager.rollback(状态);
}
返回标志;
}**
只有当从带注释的方法中抛出RuntimeException或子类时,才会回滚。如果要回滚任何
异常
(例如
SQLException
,它不是运行时异常),您应该执行以下操作:

@Transactional(rollbackFor = Exception.class)
如果您想尝试回滚可能发生的任何错误

@Transactional(rollbackFor = Throwable.class)

尽管在最后一种情况下,运行时可能会中断,甚至回滚都无法完成。

实际上,由Sir提供的answaer,M.Deinum如下所示:


Spring使用代理应用AOP,这只适用于从外部调用的方法。内部方法调用不通过代理,因此没有事务,根据您的查询,您会得到一个或多个较小的提交。确保外部方法(调用以启动所有内容的方法)是事务性的M.Deinum 14小时前

我会使用一个简单的空
@Transactional
并简单地重新显示异常(
DataAccessException
是一个
RuntimeException
),而且您正在丢失上下文(因为您忽略了原始异常)。接下来,您不应该创建自己的
JdbcTemplate
,而应该注入一个(或者至少创建一个实例)。最后,确保使用支持事务的数据库,例如MyISAM表中的MySQL不支持事务。我还想知道这个方法是如何被调用的,就好像这是一个内部方法调用一样,
@Transactional
是无用的。先生,谢谢你的建议,但我不清楚我在这里遗漏了什么。请通过代码或修改上述代码提供一些示例。我会很感激你的。你不明白什么?先生,我试过你的方法只是简单地重新抛出异常,但不起作用。我不明白,如果它是内部方法调用的方式。是的,它是从同一类中的另一个方法调用的。如果这是一个问题,那么如何克服,仅供参考,我是新的春天。ThanksSpring使用代理应用AOP,这只适用于从外部调用的方法。内部方法调用不通过代理,因此没有事务,根据您的查询,您会得到一个或多个较小的提交。请确保外部方法(调用以启动所有内容的方法)是事务性的。谢谢您的建议。我已经试过了,但仍然不能为Exception.class工作。我错过了什么。它在异常之前插入8条记录,当异常发生在第9条记录时,它将不会使用上述代码回滚先前插入的记录。
@Transactional(rollbackFor = Exception.class)
@Transactional(rollbackFor = Throwable.class)