spring中事务是怎么用的
-
Spring中的事务是通过@Transactional注解来进行管理的。我们可以在需要添加事务的方法或类上使用@Transactional注解来指定事务的属性。
在使用@Transactional注解时,可以指定以下属性:
-
propagation:事务的传播属性,用于定义事务的传播行为。常用的传播属性有:REQUIRED(默认值),表示当前方法必须在一个事务中运行,如果没有事务,则会开启一个新的事务;REQUIRES_NEW,表示当前方法必须在一个新的事务中运行,如果当前存在事务,则会将该事务挂起;SUPPORTS,表示当前方法支持事务,如果没有事务,则以非事务的方式运行;NOT_SUPPORTED,表示当前方法不支持事务,即使存在事务,也会以非事务的方式运行;等等。
-
isolation:事务的隔离级别,用于定义事务的隔离程度。常用的隔离级别有:DEFAULT(默认值),使用数据库的默认隔离级别;READ_UNCOMMITTED,表示可以读取未提交的数据;READ_COMMITTED,表示只能读取已提交的数据;REPEATABLE_READ,表示可重复读取,即同一事务中多次读取同一数据会得到相同的结果;SERIALIZABLE,表示串行化,即同一事务中多次读取同一数据会得到不同的结果。
-
timeout:事务的超时时间,用于定义事务的等待时间,超过该时间则事务自动回滚,默认值为-1,表示不设置超时时间。
-
readOnly:事务的只读属性,用于指定事务是否为只读事务。如果为只读事务,则不允许对数据进行修改操作。
-
rollbackFor:事务的回滚条件,用于指定哪些异常会触发事务回滚。默认情况下,Spring只会对RuntimeException及其子类进行事务回滚,如果我们还想对其他异常进行事务回滚,则可以使用rollbackFor属性来指定。
除了@Transactional注解,还可以使用编程式事务管理,通过TransactionTemplate类来实现。我们可以通过TransactionTemplate的execute()方法在一个范围内执行事务,事务的提交和回滚都是由TransactionTemplate来管理的。
总之,Spring提供了强大而灵活的事务管理机制,我们可以根据实际需求选择合适的注解或编程式方式来管理事务。
1年前 -
-
在Spring框架中,使用事务是通过@Transactional注解来实现的。事务用于管理数据库操作的一组操作,确保这些操作要么全部成功提交,要么全部回滚。以下是在Spring中使用事务的几个要点:
-
事务管理器(Transaction Manager):Spring提供了多个事务管理器实现,可以根据具体数据库使用的事务管理器。常用的事务管理器包括JDBC、Hibernate和JPA等。在Spring配置文件中,需要配置事务管理器的相关信息。
-
@Transactional注解: @Transactional注解应用在类或方法上,用于标记这个类或方法需要进行事务管理。注解可以设置多个属性,用于指定事务的传播行为(Propagation)、隔离级别(Isolation)、只读性(ReadOnly)和异常回滚规则(RollbackFor等)。
-
声明事务边界:通过在方法上添加@Transactional注解,将该方法划定为一个事务边界。当方法开始执行时,Spring会自动创建一个数据库事务,并在方法结束时根据情况,提交事务或者回滚事务。
-
事务传播行为:@Transactional注解的propagation属性用于指定事务的传播行为。常用的传播行为包括REQUIRED、REQUIRES_NEW、NESTED等。REQUIRED表示当前方法加入现有的事务,如果没有事务,则创建新事务。REQUIRES_NEW表示当前方法创建一个新事务,如果存在事务则挂起。NESTED表示当前方法在一个已经存在的事务内执行,如果没有事务,则同REQUIRED一样。
-
事务隔离级别:@Transactional注解的isolation属性用于指定事务的隔离级别。常用的隔离级别有READ_COMMITTED、READ_UNCOMMITTED、REPEATABLE_READ、SERIALIZABLE等。事务隔离级别用于控制事务之间的相互影响程度和并发性能。
需要注意的是,在使用Spring事务时,需要确保数据库连接池和事务管理器等资源的正确配置,以及数据库驱动的正确引入和配置。另外,确保在Spring配置文件中开启注解驱动的事务管理,即添加 tx:annotation-driven/。
1年前 -
-
Spring中事务的使用方法主要有两种:声明式事务和编程式事务。
一、声明式事务:
声明式事务是通过使用@Transactional注解来实现的,可以在类级别或方法级别上使用该注解。- 在配置文件中开启声明式事务管理器:
在Spring的配置文件中,需要配置一个事务管理器,可以使用Spring自带的事务管理器或者第三方的事务管理器。示例配置如下:
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean>- 在需要添加事务的方法上添加@Transactional注解:
在需要添加事务的方法上添加@Transactional注解,表示该方法需要进行事务管理。示例代码如下:
@Transactional public void doSomething() { //执行具体的业务逻辑 }- 配置事务的属性:
@Transactional注解还可以配置一些属性来控制事务的行为。常用的属性包括事务的传播行为、事务的隔离级别、事务的超时时间等。示例代码如下:
@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT, timeout = 3600, readOnly = false) public void doSomething() { //执行具体的业务逻辑 }二、编程式事务:
编程式事务是通过Spring的TransactionTemplate来实现的,通过编写代码来显示地控制事务的开启、提交和回滚。- 使用TransactionTemplate进行事务管理:
示例代码如下:
@Autowired private TransactionTemplate transactionTemplate; public void doSomething() { transactionTemplate.execute(new TransactionCallbackWithoutResult() { @Override protected void doInTransactionWithoutResult(TransactionStatus status) { //执行具体的业务逻辑 } }); }- 手动控制事务:
使用TransactionTemplate提供的方法手动控制事务的开启、提交和回滚。示例代码如下:
@Autowired private TransactionTemplate transactionTemplate; public void doSomething() { // 开启事务 transactionTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED); TransactionStatus status = transactionTemplate.getTransactionManager().getTransaction(transactionTemplate); try { //执行具体的业务逻辑 //提交事务 transactionTemplate.getTransactionManager().commit(status); } catch (Exception e) { //回滚事务 transactionTemplate.getTransactionManager().rollback(status); } }声明式事务和编程式事务的使用方式各有优劣,一般推荐使用声明式事务,因为它可以将事务的管理从具体的业务逻辑中解耦出来,代码更加简洁清晰,并且支持AOP的方式实现事务的代理。编程式事务则适用于需要更加细粒度的事务控制的场景。
1年前 - 在配置文件中开启声明式事务管理器: