【发布时间】:2016-05-03 00:21:04
【问题描述】:
我有这个数据库配置:
@Configuration
@EnableTransactionManagement
@ComponentScan(basePackages = "com.mycompany")
public class DBConfiguration {
@Bean(destroyMethod = "close")
public javax.sql.DataSource dataSource() {
DataSource ds = new DataSource();
ds.setDriverClassName("com.mysql.jdbc.Driver");
ds.setUrl("jdbc:mysql://localhost/v2");
ds.setUsername("java");
ds.setPassword("mypass");
ds.setInitialSize(5);
ds.setMaxActive(10);
ds.setMaxIdle(5);
ds.setMinIdle(2);
ds.setRemoveAbandoned(true);
ds.setLogAbandoned(true);
return ds;
}
@Bean
public DataSourceTransactionManager txManager()
{
DataSourceTransactionManager tx= new DataSourceTransactionManager(dataSource());
return tx;
}
}
问题已更新
我很难理解@Transaction 注解是如何工作的,请考虑这种情况:
@Service
public class FirstService {
@Transactional //<--- this annotation seems to be mandatory for my rollback but I don't want it.
public void test() throws Exception{
secondService.insert();
}
}
@Service
public class SecondService {
@Transactional //<-- I would like to have only this method in transaction
protected void insert() throws Exception{
dao.insertEntity(new Entity()); //<<--- this is an SQL insert command
throw new RuntimeException("Rollback test");
}
}
测试代码:
@RequestMapping("/test") @ResponseBody
public void test() throws Exception{
firstService.test();
}
道:
public void insertEntity(Entity e) {
getJdbcTemplate().update(SQL_INSERT,e.getCode(),e.getName());
}
这个测试有效,抛出的异常可以回滚事务。
为什么我在 firstService 上省略了@Transaction 注解就没有回滚?
似乎从@Controller 到@Service txmanager 寻找@Transaction 注释,从@Service 到(另一个)@Service 或@Component 它不寻找它。
【问题讨论】:
-
你可以把你的日志放在调试中,看看@transactional是否附加到你的spring transactionManager。
-
贴出测试的代码,以及DAO的代码。
-
你正在使用 InnoDB 表,对吧(或者至少不是 MyISAM)?
-
当然是 InnoDB :-)
-
我没有看到事务日志(带调试级别)
标签: java mysql spring jdbc spring-transactions