spring中如何开启事务,事务的特点有哪些?
时间: 2023-06-11 21:10:27 浏览: 60
在Spring中开启事务可以使用@Transactional注解,这个注解可以加在方法上或者类上,用于标识一个方法或类需要进行事务管理。当被标识的方法被调用时,Spring会自动开启一个事务,在方法执行完毕后,会根据方法执行的结果来决定是提交事务还是回滚事务。
事务的特点有以下几个:
1. 原子性:事务是一个不可分割的操作单元,要么全部执行,要么全部不执行。
2. 一致性:事务执行前后,数据的完整性、一致性得到保障。
3. 隔离性:多个事务并发执行时,各个事务之间是相互独立的,彼此不会干扰。
4. 持久性:事务一旦提交,对数据的修改将会永久保存到数据库中,即使系统故障也不会丢失。
相关问题
Spring中如何开启事务?
在Spring中,我们可以通过声明式事务管理或编程式事务管理来开启事务。
1. 声明式事务管理:通过在XML配置文件中定义事务切面,指定需要进行事务管理的方法或类。
示例代码:
```
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="save*" propagation="REQUIRED" />
<tx:method name="update*" propagation="REQUIRED" />
<tx:method name="delete*" propagation="REQUIRED" />
<tx:method name="*" read-only="true" />
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="serviceMethods" expression="execution(* com.example.service..*.*(..))" />
<aop:advisor advice-ref="txAdvice" pointcut-ref="serviceMethods" />
</aop:config>
```
2. 编程式事务管理:通过在代码中使用TransactionTemplate或编程式事务通知来开启事务。
示例代码:
```
@Autowired
private DataSourceTransactionManager transactionManager;
public void save(User user) {
TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager);
transactionTemplate.execute(new TransactionCallbackWithoutResult() {
@Override
protected void doInTransactionWithoutResult(TransactionStatus transactionStatus) {
userDao.save(user);
}
});
}
```
以上是开启事务的两种方式,选择哪种方式取决于应用程序的需求和个人偏好。
spring的事务传播行为有哪些?
Spring中的事务传播行为指的是在一个事务方法调用另一个事务方法时,如何处理这两个事务的关系。常见的事务传播行为有以下几种:
1. REQUIRED:如果当前没有事务,则创建一个新事务;如果当前存在事务,则加入该事务。
2. SUPPORTS:如果当前存在事务,则加入该事务;如果当前不存在事务,则以非事务执行。
3. MANDATORY:如果当前存在事务,则加入该事务;如果当前不存在事务,则抛出异常。
4. REQUIRES_NEW:创建一个新事务,并且暂停当前事务(如果存在)。
5. NOT_SUPPORTED:以非事务执行,并且暂停当前事务(如果存在)。
6. NEVER:以非事务执行,如果当前存在事务,则抛出异常。
7. NESTED:如果当前存在事务,则在该事务中开启一个嵌套事务;如果当前不存在事务,则创建一个新事务。嵌套事务可以独立提交或回滚,但必须在外部事务的提交或回滚时一起提交或回滚。
以上就是常用的Spring事务传播行为。