如果 B 出错,请回滚 A。弹簧靴, jdbc模板
我有一个方法,“databaseChanges”,它以迭代方式调用2个操作:A,B。“A”在前,“B”在后。'A' & 'B' 可以是 Create, Update Delete 功能在我的持久存储,Oracle Database 11g。
比方说,
“A”更新表 Users 中的记录,属性 zip,其中 id = 1。
“B”在表格爱好中插入记录。
场景:数据库调用更改方法,“A”操作并更新记录。“B”操作并尝试插入记录,发生某些情况,引发异常,异常冒泡到数据库Changes方法。
预期:“A”和“B”没有改变任何东西。“A”所做的更新将是回滚。“B”什么也没改变,嗯...有一个例外。
实际:“A”更新似乎未回滚。“B”什么也没改变,嗯...有一个例外。
一些代码
如果我有联系,我会做这样的事情:
private void databaseChanges(Connection conn) {
try {
conn.setAutoCommit(false);
A(); //update.
B(); //insert
conn.commit();
} catch (Exception e) {
try {
conn.rollback();
} catch (Exception ei) {
//logs...
}
} finally {
conn.setAutoCommit(true);
}
}
问题:我没有连接(请参阅随问题一起发布的标签)
我试图:
@Service
public class SomeService implements ISomeService {
@Autowired
private NamedParameterJdbcTemplate jdbcTemplate;
@Autowired
private NamedParameterJdbcTemplate npjt;
@Transactional
private void databaseChanges() throws Exception {
A(); //update.
B(); //insert
}
}
我的应用配置类:
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
@Configuration
public class AppConfig {
@Autowired
private DataSource dataSource;
@Bean
public NamedParameterJdbcTemplate namedParameterJdbcTemplate() {
return new NamedParameterJdbcTemplate(dataSource);
}
}
“A”进行更新。从“B”中引发异常。由“A”进行的更新未回滚。
从我读到的内容中,我明白我没有正确使用@Transactional。我阅读并尝试了几篇博客文章和stackverflow问答,但没有成功解决我的问题。
有什么建议吗?
编辑
有一个调用数据库Changes()方法的方法
public void changes() throws Exception {
someLogicBefore();
databaseChanges();
someLogicAfter();
}
哪种方法应该用@Transactional注释,
更改()?数据库更改()?