spring手动开启事务
时间: 2023-07-19 14:22:45 浏览: 109
这一次搞懂Spring事务注解的解析方式
在Spring中,我们可以通过编程的方式(即手动)来开启事务。具体步骤如下:
1. 在Spring配置文件中开启事务管理器:
```
<!-- 配置事务管理器 -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
```
2. 在需要开启事务的方法上添加@Transactional注解:
```
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao;
@Transactional
public void transferMoney(int fromUserId, int toUserId, double money) {
User fromUser = userDao.getUserById(fromUserId);
User toUser = userDao.getUserById(toUserId);
fromUser.setBalance(fromUser.getBalance() - money);
toUser.setBalance(toUser.getBalance() + money);
userDao.updateUser(fromUser);
userDao.updateUser(toUser);
}
}
```
在上面的例子中,我们在transferMoney方法上添加了@Transactional注解,这样Spring就会自动开启事务,并在方法执行完毕后自动提交或回滚事务。
需要注意的是,如果我们在一个类中调用了另一个类中被@Transactional注解的方法,那么事务并不会自动传播。因此,需要在调用方的方法上也添加@Transactional注解,并设置propagation属性为REQUIRED。例如:
```
@Service
public class OrderServiceImpl implements OrderService {
@Autowired
private UserService userService;
@Transactional(propagation = Propagation.REQUIRED)
public void placeOrder(int userId, double amount) {
// 生成订单,并扣除用户账户余额
userService.transferMoney(userId, 1, amount);
// ...
}
}
```
在上面的例子中,我们在placeOrder方法上也添加了@Transactional注解,并设置propagation属性为REQUIRED,这样事务就能够正确传播。
阅读全文