💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
## 注解方式 1. 需要申请配置事物管理 (在spring beans配置文件中) ``` <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"></property> </bean> ``` 2. 启用事务注解(在spring beans配置文件中) ``` <tx:annotation-driven transaction-manager="transactionManager"/> ``` 3. 在需要开启事物的方法上添加注解 `@Transactional` >### Transactional属性 - **PROPAGATION**设置事物的传播行为 当一个事务方法,调用另外一个事务方法的时候。 **需要在被调用的事物是使用PROPAGATION属性**。 (常用的两个`PROPAGATION_REQUIRED`,`PROPAGATION_REQUIRES_NEW`) 1. REQUIRED--支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。 2. REQUIRES_NEW--新建事务,如果当前存在事务,把当前事务挂起。 3. SUPPORTS--支持当前事务,如果当前没有事务,就以非事务方式执行。 4. MANDATORY--支持当前事务,如果当前没有事务,就抛出异常。 NOT_SUPPORTED--以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。 5. NEVER--以非事务方式执行,如果当前存在事务,则抛出异常。 6. NESTED-- 如果有事务在运行,当前的方法就应该在这个事务的嵌套事务内运行,否则就启动一个新的事务,并在它自己的事务内运行。 - `isolation`设置事务的隔离级别 `isolation=Isolation.READ_COMMITTED`最常用 - 默认spring声明式事务对所有异常回滚,也可以去做设置,但是一般不做。 - 只读事务,表示这个事务只读取数据但不更新数据,这样可以帮助数据库引擎优化事务。 使用`readOnly `指定事务是否为只读,由于事务可以在行和表上获得锁,因此长事务会占用资源,对整体性能产生影响。 如果一个事务只读取数据,但是不做修改,数据库引擎可以对这个事务进行优化。 - 超时事务属性,事务在强制回滚之前可以保持多久,这样可以防止长期运行的事务占用资源。`timeout `秒。 ## XML文件配置方式(与AOP配合使用) 1. 配置事务管理器(同注解方式) 2. 配置事务属性 ``` <!-- 配置事务属性。 --> <tx:advice id="txadvice" transaction-manager="transactionManager"> <!-- 事务属性 --> <tx:attributes> <!-- name属性可以对应具体的方法名称 。然后配置事务具体的属性,传播行为,propagation 以及isolation等。。。 --> <tx:method name="exchangeGoods" propagation="REQUIRES_NEW"/> <tx:method name="find*" read-only="true"/> <tx:method name="get*" read-only="true"/> <tx:method name="*"/> <!-- *匹配所有方法,exchangeGoods给特定方法添加事务。get find开头的方法添加事务。 --> </tx:attributes> </tx:advice> 3. 配置事务切入点 ``` <!-- 将配置好的事务属性添加到指定方法 。使用springAOP切点表达式进行配置。 --> <aop:config> <aop:pointcut expression="execution(* com.yuan.spring.service.*.*(..))" id="txpointcut"/> <!-- 合并事务跟切点 --> <aop:advisor advice-ref="txadvice" pointcut-ref="txpointcut"/> </aop:config>