spring事务 insert成功之后出现异常不回滚

 @Transactional(rollbackFor=RuntimeException.class, propagation = Propagation.REQUIRED,isolation= Isolation.READ_UNCOMMITTED)

声明式配置

前面一个insert操作
                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); //手动开启事务回滚
                throw new RuntimeException();

insert未回滚

这两行没用在service层还是出现了脏数据

是不是你的配置文件没有配置事务管理

配了……对事务的隔离性都挺好的 处理了并发问题
但是就是异常不回滚 1/0都没用

<!-- 进行主数据库的事务配置,采用默认策略 -->
<bean id="transactionManager"
      class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="maindb" />
</bean>
<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/>

借鉴回答:-------在service类前加上@Transactional,声明这个service所有方法需要事务管理。每一个业务方法开始时都会打开一个事务。
Spring默认情况下会对运行期例外(RunTimeException)进行事务回滚。这个例外是unchecked
如果遇到checked意外就不回滚。
如何改变默认规则:
1 让checked例外也回滚:在整个方法前加上 @Transactional(rollbackFor=Exception.class)
2 让unchecked例外不回滚: @Transactional(notRollbackFor=RunTimeException.class)
3 不需要事务管理的(只查询的)方法:@Transactional(propagation=Propagation.NOT_SUPPORTED)

注意: 如果异常被try{}catch{}了,事务就不回滚了,如果想让事务回滚必须再往外抛try{}catch{throw Exception}。

在service需要将异常抛出,而且是运行时异常,如果用的是mysql,看表是否是innodb引擎的

开启事务的这个方法是不是已经注入了,或者说这个方法是不是继承接口的方法?

@Transactional(rollbackFor=RuntimeException.class --> 运行时异常才回滚。你可以把 rollbackFor 设置为 Exception.class 异常就回滚。

多谢各位 主要问题是猜测是因为jdbc的session 这里有坑
jdbcTemplate.update(
new PreparedStatementCreator() {
public PreparedStatement createPreparedStatement(Connection con) throws SQLException
{
PreparedStatement ps = jdbcTemplate.getDataSource()
.getConnection().prepareStatement(sql,
new String[]{"ID"});
for(int i=0;i<args.length;i++){
ps.setString(i+1, args[i].toString());
}
return ps;
}
}, keyHolder
);
这个东西写在事务里面开的是另外的connect 所以才不受事务管制