jdbctemplate 事务_Spring编程式和声明式事务实例讲解
时间: 2024-02-07 17:02:18 浏览: 102
在 Spring 中,我们可以通过编程式事务和声明式事务来处理数据库事务。下面我来分别介绍一下这两种事务的实现。
## 编程式事务
编程式事务是通过代码实现事务控制,需要手动创建和提交事务。Spring 提供了一个名为 `TransactionTemplate` 的类来帮助我们实现编程式事务。
我们可以使用 `TransactionTemplate` 来控制事务的开启、提交、回滚等操作。下面是一个简单的例子:
```java
@Service
public class UserService {
@Autowired
private JdbcTemplate jdbcTemplate;
@Autowired
private TransactionTemplate transactionTemplate;
public void transfer(int fromId, int toId, int amount) {
transactionTemplate.execute(new TransactionCallbackWithoutResult() {
@Override
protected void doInTransactionWithoutResult(TransactionStatus status) {
try {
jdbcTemplate.update("update account set amount = amount - ? where id = ?", amount, fromId);
jdbcTemplate.update("update account set amount = amount + ? where id = ?", amount, toId);
} catch (Exception e) {
status.setRollbackOnly();
throw e;
}
}
});
}
}
```
上面的代码中,我们使用 `TransactionTemplate` 来控制转账操作的事务,如果出现异常,则会回滚事务。
## 声明式事务
声明式事务是通过配置文件来实现事务控制,无需手动创建和提交事务。Spring 提供了一个叫做 `@Transactional` 的注解来帮助我们实现声明式事务。
我们只需要在需要添加事务的方法上加上 `@Transactional` 注解,就可以实现声明式事务。下面是一个简单的例子:
```java
@Service
public class UserService {
@Autowired
private JdbcTemplate jdbcTemplate;
@Transactional
public void transfer(int fromId, int toId, int amount) {
jdbcTemplate.update("update account set amount = amount - ? where id = ?", amount, fromId);
jdbcTemplate.update("update account set amount = amount + ? where id = ?", amount, toId);
}
}
```
上面的代码中,我们在 `transfer` 方法上添加了 `@Transactional` 注解,这样就可以实现转账操作的事务控制了。
声明式事务的好处是我们无需手动创建和提交事务,代码更加简洁,但是配置稍微复杂一些。
阅读全文