当前位置: 首页 > news >正文

杭州网络公司网站佛山网站搜索排名

杭州网络公司网站,佛山网站搜索排名,高端网站建设需要多少钱,网站建设团队一、场景概述 想象一个用户注册流程: 保存用户基本信息(核心操作)初始化用户账户(重要但可独立失败)发送欢迎邮件(非关键操作) 二、代码事务传播分析 1. 主事务:用户注册&#xf…

一、场景概述

想象一个用户注册流程:

  1. 保存用户基本信息(核心操作)
  2. 初始化用户账户(重要但可独立失败)
  3. 发送欢迎邮件(非关键操作)

二、代码事务传播分析

1. 主事务:用户注册(REQUIRED)

 

@Transactional(propagation = Propagation.REQUIRED)
public void register(User user) {// 保存用户(主事务操作)userDao.save(user);// 初始化账户(嵌套事务)accountService.initAccount(user.getId());// 发送邮件(非事务操作)emailService.sendWelcomeEmail(user.getEmail());
}

2. 子事务:账户初始化(NESTED)

@Transactional(propagation = Propagation.NESTED)
public void initAccount(Long userId) {// 初始化账户操作
}

三、事务传播机制详解

1. REQUIRED(主事务)

  • 行为:有则加入,无则新建
  • 当前场景:当register()被调用时
    • 没有现有事务 → 创建新事务(事务A)
    • 所有操作都在事务A中执行

2. NESTED(嵌套事务)

  • 行为:在现有事务中创建"嵌套事务"
  • 关键特性
    • 设置数据库保存点(savepoint)
    • 可独立回滚不影响主事务
    • 主事务回滚会连带回滚嵌套事务

四、场景执行分析

场景1:完美流程(全部成功)

  1. 保存用户 → 成功
  2. 初始化账户 → 成功
  3. 发送邮件 → 成功
  4. 提交主事务 → 所有操作生效

结果:用户创建成功,账户初始化完成,邮件已发送

场景2:账户初始化失败

  1. 保存用户 → 成功
  2. 初始化账户 → 失败(抛出异常)
  3. 捕获异常 → 记录日志
  4. 发送邮件 → 成功
  5. 提交主事务 → 仅保存用户操作生效

结果

  • ✅ 用户创建成功
  • ❌ 账户初始化失败(但被捕获)
  • ✅ 邮件已发送

场景3:主事务失败

  1. 保存用户 → 成功
  2. 初始化账户 → 成功
  3. 发送邮件前系统崩溃 → 主事务回滚

结果

  • ❌ 用户创建回滚
  • ❌ 账户初始化回滚(连带回滚)
  • ❌ 邮件未发送

五、嵌套事务的本质

1. 数据库保存点(Savepoint)

START TRANSACTION; -- 主事务开始-- 主操作
INSERT INTO users (...) VALUES (...);SAVEPOINT sp1; -- 设置保存点-- 嵌套操作
INSERT INTO accounts (...) VALUES (...);-- 如果嵌套操作失败
ROLLBACK TO sp1; -- 回滚到保存点-- 继续其他操作...COMMIT; -- 提交主事务

2. 嵌套事务特性

特性说明示例
独立回滚嵌套事务可单独回滚账户初始化失败不影响用户保存
依赖提交嵌套操作随主事务提交主事务成功才真正生效
连带回滚主事务回滚导致嵌套回滚用户保存失败导致账户初始化回滚

六、为什么这样设计?

1. 业务需求分析

操作重要性事务要求
保存用户关键必须成功
初始化账户重要但可重试可独立失败
发送邮件非关键无需事务

2. 事务选择依据

  • REQUIRED:主操作必须保证原子性
  • NESTED:重要但可失败的操作
  • 无事务:非关键操作

 

七、对比其他传播行为

1. 如果使用REQUIRES_NEW

// 账户服务
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void initAccount(Long userId) { ... }

问题

  • 账户初始化完全独立事务
  • 即使主事务回滚,账户操作仍可能提交
  • 导致数据不一致(用户不存在但账户存在)

2. 如果使用SUPPORTS

// 账户服务
@Transactional(propagation = Propagation.SUPPORTS)
public void initAccount(Long userId) { ... }

问题

  • 没有独立事务控制
  • 账户失败会导致主事务回滚
  • 用户保存也会被回滚

八、最佳实践总结

1. 事务传播选择指南

场景推荐传播行为
核心操作(必须成功)REQUIRED
重要但可失败的操作NESTED
非关键操作无事务或NOT_SUPPORTED
完全独立操作REQUIRES_NEW

2. 嵌套事务使用要点

  1. 数据库支持:MySQL InnoDB等支持保存点的引擎
  2. 异常处理:必须捕获嵌套事务异常
  3. 性能考虑:不宜嵌套过深
  4. 业务对齐:嵌套事务必须属于同一业务单元

九、扩展思考

1. 如果邮件服务需要事务?

// 邮件服务
@Transactional(propagation = Propagation.NOT_SUPPORTED)
public void sendWelcomeEmail(String email) {// 记录邮件发送日志(需要事务)emailLogDao.save(new EmailLog(email));// 实际发送邮件emailClient.send(email);
}

解决方案

@Service
public class EmailService {// 邮件日志服务(使用REQUIRES_NEW)@Transactional(propagation = Propagation.REQUIRES_NEW)public void logEmail(String email) {emailLogDao.save(new EmailLog(email));}// 发送服务(无事务)public void sendWelcomeEmail(String email) {logEmail(email); // 独立事务记录日志emailClient.send(email); // 非事务操作}
}

2. 多服务嵌套场景

public void register(User user) {userDao.save(user); // 主事务accountService.initAccount(user.getId()); // 嵌套事务profileService.initProfile(user.getId()); // 另一个嵌套事务
}

处理原则

  1. 每个嵌套事务设置独立保存点
  2. 分别捕获处理异常
  3. 确保主事务不受影响

十、总结

在这个用户注册场景中,我们通过合理的事务传播机制设计:

  1. REQUIRED 保证核心操作(用户保存)的原子性
  2. NESTED 处理重要但可失败的操作(账户初始化)
  3. 无事务 执行非关键操作(邮件发送)

这种设计实现了:

  • 核心业务100%可靠
  • 重要业务可独立失败不影响主流程
  • 非关键业务不阻塞主事务

事务传播机制的本质是:根据业务重要性,为不同操作匹配合适的事务保证级别

http://www.ritt.cn/news/2901.html

相关文章:

  • 做网站需要什么设备百度提交网址入口
  • 仿一个网站谷歌搜索引擎入口2023
  • 公司推广网站怎么做拉新十大推广app平台
  • 如何给网站做右侧悬浮电话福清市百度seo
  • 网站在国内服务器在国外广州宣布5条优化措施
  • 湖北省建设厅官方网站电话软文形式推广产品
  • 用qt做网站可以吗免费发布信息的平台
  • 注册网站会员有风险吗企业网站的类型
  • 用幽默的语言来形容网站开发药品销售推广方案
  • 案例较少如何做设计公司网站网络营销的效果是什么
  • 做鞋子的招聘网站有哪些软文写手接单平台
  • 互联网网站制作公司哪家好今日热点新闻10条
  • 网站建设高清图疫情排行榜最新消息
  • 网站主机免费seo投放营销
  • 有什么展厅设计做的好的网站友链交换平台源码
  • 做医疗的网站怎么线上推广自己的产品
  • 外国做家具的网站品牌营销推广
  • 深圳做网站企业360线上推广
  • 成安网站建设域名注册入口
  • 免费网站你会回来感谢我的seo运营
  • 建立一个商城网站seo培训网
  • 英文版wordpress主题开封搜索引擎优化
  • 常州公司网站建设免费营销软件网站
  • 公司网站怎么申请创建网站怎么创
  • 阳泉那有做网站的怎么可以让百度快速收录视频
  • 无锡做设计公司网站郑州seo代理商
  • 泰安公司做网站百度搜索指数查询
  • 上海通信管理局网站八八网
  • 网站首页动画模板网站改版
  • 阳江做网站公司推广拉新任务的平台