首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Spring事务学习总结

Spring事务学习总结

原创
作者头像
lantz还在学
发布2025-11-05 17:06:14
发布2025-11-05 17:06:14
1250
举报
文章被收录于专栏:javaweb&springjavaweb&spring

Spring事务管理

注解

  • 注解: @Transactional
  • 位置: 业务(service)层的方法上、类上、接口上,而不是业务层的实现类
  • 作用: 将当前方法交给spring进行事务管理,方法执行前,开启事务;成功执行完毕,提交事务;出现异常,回滚事务

代码实践

代码语言:java
复制
@Transactional
@Override
public void delete(Integer id) {
    //1. 删除部门
    deptMapper.delete(id);
    int i = 1/0; //模拟抛出异常
    //2. 根据部门id,删除部门下的员工信息
    empMapper.deleteByDeptId(id);
}

// 部门接口类
@Transactional
public interface DeptService {
    // CODE...
}

// 部门接口实现类
@Transactional
@Service
public class DeptServiceImpl implements DeptService {
    // CODE...
}

Spring中配置开启事务管理日志,开启之后可以在调试窗口看到事务

代码语言:java
复制
# 开启事务管理日志
logging:
  level:
    org.springframework.jdbc.support.JdbcTransactionManager: debug

事务角色

事务管理员:发起事务时,在Spring中通常指代业务层开启事务的方法,负责发起事务,决定事务的开始与提交/回滚

事务协调员:加入事务后,在Spring中通常指代数据层方法,也可以是业务层方法,负责参与已有事务,在事务中执行具体的数据库操作或业务逻辑。

角色

含义

在 Spring 中的对应

举例

事务管理员(Transaction Initiator)

负责发起事务,决定事务的开始与提交/回滚。

通常指 业务层方法(Service 层) 上声明了 @Transactional 且事务传播行为为 REQUIRED(默认)。

UserService.saveUser() 开启事务,调用 DAO 层操作。

事务协调员(Transaction Participant)

负责参与已有事务,在事务中执行具体的数据库操作或业务逻辑。

通常是 数据访问层(DAO 层) 或其他 被同一事务包裹的业务方法。 这些方法通常也是 @Transactional(propagation = REQUIRED)SUPPORTS,从而加入现有事务

UserRepository.insert() 在已有事务中执行 SQL,不单独提交。

示例代码:

代码语言:java
复制
@Service
public class UserService {

    @Autowired
    private UserRepository userRepository;
    @Autowired
    private LogService logService;

    @Transactional // 事务管理员
    public void registerUser(User user) {
        userRepository.save(user);   // 事务协调员
        logService.logRegistration(user); // 若 logService 使用 REQUIRED,也为协调员
    }
}

@Service
public class LogService {

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void logRegistration(User user) {
        // 新事务,成为自己的事务管理员
        // 不影响外层 registerUser() 的事务
    }
}

事务属性--回滚

rollbackFor

默认情况下,只有出现 RuntimeException 才回滚异常。rollbackFor属性用于控制出现何种异常类型,回滚事务。

代码语言:java
复制
@Transactional(rollbackFor = Exception.class) // 回滚
default boolean saveBatch(Collection<T> entityList) {
    return saveBatch(entityList, DEFAULT_BATCH_SIZE);
}

表格一览

属性

作用

示例

readOnly

设置是否为只读事务

readOnly=true 只读事务

timeout

设置事务超时时间

timeout = -1(永不超时)

rollbackFor

设置事务回滚异常(class)

rollbackFor = {NullPointerException.class}

rollbackForClassName

设置事务回滚异常(String)

同上格式为字符串

noRollbackFor

设置事务不回滚异常(class)

noRollbackFor = {NullPointerException.class}

noRollbackForClassName

设置事务不回滚异常(String)

同上格式为字符串

propagation

设置事务传播行为

……

事务属性--传播行为

属性值

含义

REQUIRED

【默认值】需要事务,有则加入,无则创建新事务

REQUIRES_NEW

需要新事务,无论有无,总是创建新事务

SUPPORTS

支持事务,有则加入,无则在无事务状态中运行

NOT_SUPPORTED

不支持事务,在无事务状态下运行,如果当前存在已有事务,则挂起当前事务

MANDATORY

必须有事务,否则抛异常

NEVER

必须没事务,否则抛异常

NESTED

如果当前事务存在,则在嵌套事务中执行,内层事务以来外层事务,如果外层失败,则会回滚内层,内层失败不影响外层。

代码实践

代码语言:java
复制
@Transactional
public void a() {
    //......
    userService.b();
    //......
}

@Transactional(propagation = Propagation.REQUIRED)
public void b() {
    //......
}

常用事务传播行为

REQUIRED:大部分情况下都是用该传播行为即可。

REQUIRES_NEW:当我们不希望事务之间相互影响时,可以使用该传播行为。比如:下订单前需要记录日志,不论订单保存成功与否,都需要保证日志记录能够记录成功。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Spring事务管理
    • 注解
    • 代码实践
    • 事务角色
    • 事务属性--回滚
      • rollbackFor
      • 表格一览
    • 事务属性--传播行为
      • 代码实践
      • 常用事务传播行为
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档