spring开启事务量程
时间: 2023-09-22 10:14:18 浏览: 47
Spring开启事务的方式有三种:
1. 基于XML配置文件的声明式事务管理:在XML配置文件中通过<tx:advice>、<aop:config>和<tx:annotation-driven>等标签对事务进行配置和管理。
2. 基于注解的声明式事务管理:通过在业务类或方法上使用@Transactional注解来声明需要进行事务管理的方法,Spring会根据注解信息自动创建事务。
3. 编程式事务管理:通过编写代码的方式来实现事务的管理,需要在代码中手动进行事务的开启、提交或回滚。
相关问题
spring开启事务开启流程
当 Spring 容器启动时,通过 AOP 的方式,对定义了 @Transactional 注解的方法进行切面处理,创建 TransactionInterceptor 对象,并将其与当前被注解的方法所在的对象进行绑定。接着在业务代码中调用 @Transactional 注解的方法时,会先委托给 TransactionInterceptor 进行处理,即创建事务并开启事务。若当前已经存在事务,则继续使用当前事务,而不是创建一个新的事务。当方法执行完成后,TransactionInterceptor 会对事务进行提交或者回滚操作。同时,它也会释放当前线程所持有的连接,然后事务结束。
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,这样事务就能够正确传播。