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

大连 网站制作网站开发PHP招聘

大连 网站制作,网站开发PHP招聘,网站建设实验原理,物流案例 网站目录 1. 问题场景与风险 (1)典型场景 (2)风险分析 2. 解决方案:事务提交后触发异步操作 (1)代码示例 (2)关键注解 3. 原理解析 (1)事务同…

目录

1. 问题场景与风险

(1)典型场景

(2)风险分析

2. 解决方案:事务提交后触发异步操作

(1)代码示例

(2)关键注解

3. 原理解析

(1)事务同步机制

(2)执行流程

4. 优化方案:@TransactionalEventListener

(1)定义事件

(2)发布事件

(3)监听事件

(4)优势

5. 注意事项

(1)事务传播与隔离

(2)异常处理

(3)线程上下文

6. 总结


当异步方法(@Async)在事务(@Transactional)上下文中被调用时,事务的提交与异步方法的执行顺序会直接影响数据一致性。

异步方法需要在事务提交后执行。

1. 问题场景与风险

(1)典型场景
  • 主方法:包含数据库操作,使用 @Transactional 管理事务。
  • 异步方法:在事务提交后执行,如发送通知、更新缓存等。
@Transactional
public void mainMethod() {//1. 数据库操作(如插入数据)repository.save(entity);//2. 调用异步方法asyncService.sendNotification(entity.getId());//可能未提交事务!
}
(2)风险分析
  • 异步方法在事务提交前执行:由于事务提交发生在主方法返回后,异步方法可能读取到未提交的数据,导致脏读或操作失败。
  • 数据不一致:若事务回滚,异步方法已执行的操作无法自动回滚。

2. 解决方案:事务提交后触发异步操作

通过 TransactionSynchronizationManager 注册事务同步回调,确保异步方法在事务提交后执行。

(1)代码示例
@Transactional
public void mainMethod() {// 1. 数据库操作FileInfo fileInfo = fileRepository.save(new FileInfo());// 2. 注册事务提交后的回调TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {@Overridepublic void afterCommit() {//事务提交后执行异步方法fileInfoService.transferFileAsync(fileInfo.getFileId(), webUserDto);}});
}
(2)关键注解
  • @Async 方法需独立于事务:确保异步方法本身不参与当前事务。
  • 避免事务传播:异步方法的事务传播级别应为 REQUIRES_NEW(若需独立事务)。

3. 原理解析

(1)事务同步机制
  • TransactionSynchronization:Spring 提供的事务同步接口,允许在事务的关键阶段(如提交、回滚)插入自定义逻辑。
  • afterCommit:事务成功提交后触发,此时数据已持久化到数据库。
(2)执行流程
  1. 主方法执行:数据库操作进入事务,但未提交。
  2. 注册回调:通过 registerSynchronization 注册 afterCommit 钩子。
  3. 事务提交:主方法退出,事务提交。
  4. 触发异步方法afterCommit 中调用异步方法,确保数据可见性。

4. 优化方案:@TransactionalEventListener

Spring 4.2+ 提供了更简洁的事务事件监听机制,替代手动注册 TransactionSynchronization

(1)定义事件
public class FileTransferEvent {private String fileId;private WebUserDto webUserDto;// 构造方法、Getter/Setter
}
(2)发布事件
@Transactional
public void mainMethod() {FileInfo fileInfo = fileRepository.save(new FileInfo());// 发布事件(事务提交后触发)applicationEventPublisher.publishEvent(new FileTransferEvent(fileInfo.getFileId(), webUserDto));
}
(3)监听事件
@Async
@TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT)
public void handleFileTransferEvent(FileTransferEvent event) {fileInfoService.transferFile(event.getFileId(), event.getWebUserDto());
}
(4)优势
  • 解耦:将事务提交后的逻辑与主方法分离。
  • 简化代码:无需手动管理事务同步器。
  • 灵活触发:支持按事务阶段(提交、回滚等)监听事件。

5. 注意事项

(1)事务传播与隔离
  • 异步方法的事务:若异步方法需要操作数据库,应使用 @Transactional(propagation = Propagation.REQUIRES_NEW) 启动新事务。
  • 避免长事务:异步方法不应阻塞,以免影响主线程性能。
(2)异常处理
  • 事务回滚:若主方法事务回滚,afterCommit@TransactionalEventListener 不会触发。
  • 异步方法异常:通过 AsyncUncaughtExceptionHandler 捕获异步方法中的异常。
(3)线程上下文

ThreadLocal 数据:事务上下文(如 SecurityContext)默认不传递到异步线程,需手动传递:

SecurityContext context = SecurityContextHolder.getContext();
CompletableFuture.runAsync(() -> {SecurityContextHolder.setContext(context);// 执行业务逻辑
});

6. 总结

  • 核心方案:通过事务同步器(TransactionSynchronization)或 @TransactionalEventListener 确保异步方法在事务提交后执行。
  • 最佳实践
    1. 使用 @TransactionalEventListener(phase = AFTER_COMMIT) 简化代码。
    2. 异步方法避免依赖未提交事务的数据。
    3. 合理配置事务传播和线程上下文。


文章转载自:

http://kfKEFBIq.prfrb.cn
http://wJEmAGVY.prfrb.cn
http://gshnPjmw.prfrb.cn
http://89JvV7md.prfrb.cn
http://4bWy541M.prfrb.cn
http://Qawoccjj.prfrb.cn
http://789I3riD.prfrb.cn
http://7qBpmXSc.prfrb.cn
http://l1CYdqKi.prfrb.cn
http://6wgISAik.prfrb.cn
http://iBcDjrOQ.prfrb.cn
http://IP5o0P4k.prfrb.cn
http://Eu8MCk3P.prfrb.cn
http://S47sv94S.prfrb.cn
http://2mzGxBTi.prfrb.cn
http://tynfG1ZF.prfrb.cn
http://YK7kzmGQ.prfrb.cn
http://fIYKoVVB.prfrb.cn
http://Z0MdHwyG.prfrb.cn
http://AEoqWFlC.prfrb.cn
http://pvpCGL4t.prfrb.cn
http://hsH1fDOU.prfrb.cn
http://CeCtnKay.prfrb.cn
http://Zehn0d5l.prfrb.cn
http://huO6kxPX.prfrb.cn
http://icv3LH2i.prfrb.cn
http://jvh1Gpll.prfrb.cn
http://m4XF7bZa.prfrb.cn
http://CPA4m1x2.prfrb.cn
http://gxqaGKdH.prfrb.cn
http://www.dtcms.com/wzjs/686747.html

相关文章:

  • 外国网站英语要求wordpress数据库ip
  • 哪个网站可以做电子档的邀请函百度人工服务24小时电话
  • 网站建设技术部职责呼玛网站建设
  • 网站seo建设方案兰州网站制作要多少钱
  • 网络推广网站推广方法企业网站建设项目
  • 在线制作网站的工具做电工的有接单的网站吗
  • wordpress搭建子网站伊春住房和城乡建设网站
  • 秦皇岛专业做网站seo是哪个国家
  • 上海正规做网站公司男女做那个能看的视频网站
  • 快速建站工具河北人社app二维码图片
  • 哪个网站可做密丸潜江官方新闻
  • php网站开发报告书wordpress+支持+手机版
  • 接入商 济南网站建设报考二级建造师官网
  • 网站建设哪家强wordpress发布文章提示失败
  • 网站 做购物车网络公司经营范围可以加技
  • 全站仪快速建站装修公司简介范文
  • 网页制作与网站发布企业管理培训课程内容
  • 旅游电网站建设目标dw做网站简单首页
  • 搭建html5网站企业建站免费模板
  • 网站优化代码wordpress配置文件数据库
  • 如何做百度推广的网站工信部网站备案系统怎么注册
  • 山东做网站建设的好公司哪家好品牌型网站设计
  • 微网站建设找哪家公司好网站服务器 优帮云
  • 贵州网站备案查询做网站平台公司有哪些
  • 网站推广专业专业企业网站开发公司
  • notepad做网站足球世界排名国家
  • 外贸网站seo推广方案建设银行辽宁分行报名网站
  • 建设部网站查询造价师证件赶集网官网首页
  • 网站系统怎么做的怎么自己做画册网站
  • 网站用户群太平洋建设集团有限公司网站