Spring事务

Spring 事务

主要是使用注解 开启事务只需配置好文件后在要开启事务的方法上加上@Transactional即可

注解使用步骤

导入依赖

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>

配置

  1. 注册DataSourceTransactionManager
  2. 开启事务注解支持
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
p:dataSource-ref="dataSource"
/>
<tx:annotation-driven
transaction-manager="transactionManager"
proxy-target-class="true"/>
</beans>

为什么说事务使用在业务层

  • 业务层是多个查询同时满足来完成一个业务 需要同时完成 如果不完成需要回滚保证数据库数据的安全 在控制层完成多个业务 单个的业务失败不影响其他业务不需要回滚

@Transactional注解 主要属性

Propagation

可选值
REQUIRED 默认值 表示如果有事务就加入事务, 没有就开启事务
REQUIRES_NEW 表示不管有没有事务,都去开启新的事务
NESTED 如果有事务, 在创建一个子事务,子事务跟主事务一起提交,如果没有父事务,在开启一个新的事务
MANDATORY 表示必须在一个已有的事务中使用,否则直接异常
SUPPORTS 如果其他类的事务方法调用了该方法,如果调用类的方法开启了事务就使用事务,否则就不用事务
NOT_SUPPORTED 不开启事务
NEVER 必须在没有事务的方法使用,否则直接抛异常

Isolation

事务的隔离级别

隔离级别 名称 含义 脏读 不可重复读 幻读
读未提交 ISOLATION_READ_UNCOMMITTED T1读取T2未提交的东西 V V V
读已提交 ISOLATION_READ_COMMITTED mysql默认,事务提交后可读 X V V
可重复读 ISOLATION_REPEATABLE_READ 针对update操作;会出现幻读现象,幻读针对的是insert操作 X X V
串行化 ISOLATION_SERIALIZABLE 解决了脏读、不可重复读和幻读,但是效率比较低 X X X

rollbackFor

指定抛出异常回滚

timeout

事务执行的超时时间

建议如果没有特殊要求,一般不要设置超过10s 3-5s

事务

在业务抛出异常

代码业务的严谨性

Spring 事务会失效

  1. Spring Spring mvc 重复扫描导致事务
  2. 方法没有使用public声明
  3. mysql必须使用引擎必须必须使用InnoDB
posted @   舟思水  阅读(16)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示