首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏愿天堂没有BUG(公众号同名)

    Spring事务监听,为什么会出现事务失效?

    之前工作中就遇到了一个问题,在事务监听时,做了一些事务操作,但是这个事务并没有生效。今天我们就来深入了解一下,这个问题是怎么产生的,又该如何解决。 问题排查先翻阅一下官方文档,在 事务事件 章节内,有这么一段提示:最后一句话的意思是:在事务事件监听内,已经没有可供加入的事务。 One More Thing且慢,我们再回想一下,Spring 的事件监听机制,其实是基于观察者模式的同步回调,而事务事件的监听同理,也是在事务提交后,获取事务同步注册器中已经注册了的回调,再同步执行。 如果在事务事件监听的同步处理中,是个耗时较长的操作,就会一直持有这个数据库连接,线上如果有大量的并发调用,数据库的连接池很容易被耗尽。 总结在这篇文章中,我们分析了在使用 Spring 的事务监听器时,因为原事务已提交,后续事务加入失败而导致的事务失效问题,解决方案就是将后续事务作为新事物处理。

    1.4K50编辑于 2023-01-05
  • 来自专栏kwai

    基于Druid的长事务监听实现

    1,增加一个Druid过滤器/** * @Project * @Description 大事务监控 * @Date 2022/10/1 下午3:52 */public class MyDruidTxMonitorFilter extends FilterEventAdapter { //记录事务状态与事务开启时间 private static final ThreadLocal<Long> TX_BEGIN_TIME = new ThreadLocal<>(); //记录事务过程中执行的sql(保留执行顺序) private static final ThreadLocal<List<String>> 2、长事务告警(记录本次事务涉及到的sql+记录本次事务的应用层调用栈) if (TX_BEGIN_TIME.get()! } } }catch (Throwable e){ e.printStackTrace(); } } }2

    4.4K82编辑于 2022-12-01
  • 来自专栏实战docker

    jetcd实战之三:进阶操作(事务监听、租约)

    》的jetcd-tutorials项目中新建名为advanced-operate的模块,本篇的源码都写在这个模块中; 事务:用jetcd实现事务,将多个操作在同一个事务中完成; 监听:对指定key的相关事件进行监听 新建好模块后,首先体验的是etcd的事务特性,我这里选择用来展示事务的例子是CAS(Compare And Set),即用jetcd来实现CAS; 关于CAS有个经典实现,就是AtomicInteger 方法的定义,入参是指定的key,以及调用方定制的监听实现,返回值Watcher是jetcd对监听事件的封装,调用方可以用Watcher来结束监听: /** * 为指定key添加监听 * @param key 键 * @param listener 监听事件 * @return jetcd对应的监听对象 * @throws key创建无限自动续租的租约; 在springboot应用的控制台上可见续租成功的日志: 2021-04-05 13:13:59.490 INFO 16472 --- [pool-1-thread-2]

    1.6K00发布于 2021-09-26
  • 来自专栏实战docker

    jetcd实战之三:进阶操作(事务监听、租约)

    系列文章链接 jetcd实战之一:极速体验 jetcd实战之二:基本操作 jetcd实战之三:进阶操作(事务监听、租约) 本篇概览 本篇是《jetcd实战系列》的第三篇,前面熟悉了jetcd的基本操作 :用jetcd实现事务,将多个操作在同一个事务中完成; 监听:对指定key的相关事件进行监听; 租约:对指定key绑定一个租约,需要不停的续租才能保证该key有效; 源码下载 本篇实战中的完整源码可在GitHub 新建好模块后,首先体验的是etcd的事务特性,我这里选择用来展示事务的例子是CAS(Compare And Set),即用jetcd来实现CAS; 关于CAS有个经典实现,就是AtomicInteger 方法的定义,入参是指定的key,以及调用方定制的监听实现,返回值Watcher是jetcd对监听事件的封装,调用方可以用Watcher来结束监听: /** * 为指定key添加监听 key创建无限自动续租的租约; 在springboot应用的控制台上可见续租成功的日志: 2021-04-05 13:13:59.490 INFO 16472 --- [pool-1-thread-2]

    71730编辑于 2021-12-07
  • 来自专栏菩提树下的杨过

    ZooKeeper 笔记(2) 监听数据变化

    在应用中程序员可以添加watcher来监听这些数据的变化,watcher只会触发一次,所以触发过后想要继续监听,必须再手动设置监听,这比较麻烦,好在ZkClient已经做了一些增强,在watcher的基础上 zk.createPersistent(nodeName); } zk.writeData(nodeName, "1"); zk.writeData(nodeName, "2" 2. 紧接着再测试testUpdateConfig(),这个方法中修改了节点的数据。 此时,由于testListener中设置了监听,所以监听程序应该会起作用,打印出相应的数据变化,类似下面的效果: yjmyzz.test.ZKTest - ready! yjmyzz.test.ZKTest - node=>/myApp yjmyzz.test.ZKTest - data=>2 yjmyzz.test.ZKTest - -------------- yjmyzz.test.ZKTest

    2K70发布于 2018-01-19
  • 来自专栏多线程

    Spring事务事务传播机制(2

    Spring事务管理提供了灵活的方式来处理事务,包括事务的创建、提交、回滚以及事务的传播行为。 书接上回:Spring事务事务传播机制(1) 2、Spring 中设置事务隔离级别 Spring 中事务隔离级别可以通过 @Transactional 中的 isolation 属性进行设置,具体操作如下图所示 该隔离级别因为可以读取到其他事务中未提交的数据,而未提交的数据可能会发生回滚,因此我们把该级别读取到的数据称之为脏数据,把这个问题称之为脏读 2、READ COMMITTED: 读已提交,也叫提交读,该隔离级别的事务能读取到已经提交事务的数据因此它不会有脏读问题 Spring 事务传播机制定义了多个包含了事务的方法,相互调用时,事务是如何在这些方法间进行传递的。 2、为什么需要事务传播机制? 嵌套事务和加入事务有什么区别 整个事务如果全部执行成功,二者的结果是⼀样的。 如果事务执行到一半失败了,那么加入事务整个事务会全部回滚;而嵌套事务会局部回滚,不会影响上一个方法中执行的结果

    59120编辑于 2023-10-16
  • 来自专栏颇忒脱的技术博客

    事务 - 2PC

    2PC github 在上一篇文章中我们介绍了本地事务,随着软件复杂度的上升,我们会需要一种可以在多个数据库之间完成事务(分布式事务)的方法,而这个方法也必须能够保证ACID。 于是就出现了2PC - Two phase commit protocol。事实上2PC不仅仅适用于多数据库事务场景下使用,也适用于所有支持2PC的参与方(Participants)。 缺点 根据上面的算法介绍可以看出2PC是一个阻塞协议: 如果两个事务针对同一个数据,那么后面的要等待前面完成,这是由于Cohort采用的是本地事务所决定的 Cohort在commit request phase 之后会阻塞,直到进入Coordinator告之Cohort进入commit phase 对于ACID的保证 2PC所保证的ACID和本地事务所提到的ACID不太一样——事实上对于所有分布式事务来说都不太一样 : A,正常情况下保证 C,在某个时间点,会出现A库和B库的数据违反一致性要求的情况 I,在某个时间点,A事务能够读到B事务部分提交的结果 D,和本地事务一样,只要commit则数据被持久 XA XA是一个针对分布式事务

    88930发布于 2018-10-19
  • 来自专栏博客迁移同步

    Spring高手之路26——全方位掌握事务监听

    什么是Spring事务监听器? Spring事务监听器是一种机制,允许我们在事务的不同阶段(如提交、回滚、开始)执行自定义逻辑。 通过事务监听器,我们可以在事务的生命周期中插入一些额外的操作,比如记录日志、发送通知、更新缓存等。2. 开启事务:业务服务向事务管理器发起请求,开启一个新的事务2.注册同步处理器:事务管理器注册事务监听器,这一步使得监听器能够在事务的不同阶段接收通知和执行特定操作。 2.开启事务:业务服务向事务管理器请求开启一个新的事务事务管理器负责管理事务的生命周期。3.注册事务事件监听器:事务管理器在事务开启后注册事务事件监听器,使其能够在事务的不同阶段接收事件通知。 例如,在事务提交或回滚时记录日志信息,以追踪事务的执行情况。2.缓存更新:在事务提交成功后更新缓存,以确保缓存中的数据与数据库中的数据一致。这样可以避免在事务尚未提交时缓存数据不一致的问题。

    87510编辑于 2024-12-20
  • 来自专栏kafka

    事务 - 2PC提交

    场景:你的业务一次操作需要同时更新多个资源,比如:两个不同的MySQL库(你现在问的场景)数据库+消息队列数据库+缓存等如果不用分布式事务,就可能出现:A库更新成功,B库更新失败→数据不一致2PC要解决的就是 二、2PC会带来哪些问题?1.性能开销大一次事务要走两个阶段,网络往返多、日志写入多。prepare阶段会长时间持有锁到commit完成,吞吐量下降,冲突增多。 2.锁时间长,容易造成阻塞在prepare之后到最终commit/rollback之前,相关行/页/表都被锁住。协调器慢、网络抖动、参与者负载高→这些锁就会被持有更久,其他事务被阻塞,甚至导致雪崩。 6.运维与排错困难出现「悬挂事务」「prepare卡住」「XA事务残留」等问题时,排查和处理都比较重。需要看协调器日志、各库的XA状态,甚至手工XARECOVER/XACOMMIT/ROLLBACK。 所以很多系统宁可用「本地事务+Outbox+CDC/消息」做最终一致性,也会慎用XA级别的2PC。

    9710编辑于 2026-01-13
  • 来自专栏Java实战博客

    2 Redis 事务 & 乐观锁

    Redis事务没有事务隔离的级别。 但是Redis事务的本质是:将一组操作放入队列(先进先出)中,批量执行。 关系型数据库的事务是:将事务操作(DML)语句写入日志。 事务相关的命令 Multi:开启事务 Exec:执行事务 Discard:终止事务 image.png 说明:Exec之前的事务操作可以被discard终止 但是一旦exec 本次事务就会执行! Redis 如何实现事务呢? 开启一个队列 让命令进入队列 执行事务 # 1 开启事务 multi # 2 输入命令 set k1 v1 set k2 v2 get k2 set k2 v3 get k2 # 3 执行/放弃事务 watch 需要锁Key名 # 线程1 操作:开启事务,并设置money为80 但不执行事务 multi set money 80 或者 decrby money 20 # 线程2 操作:读取money

    57020编辑于 2022-01-19
  • Vue——vue2监听元素style变化

    前言 纯粹是为了偷懒,不想再安装swiper来渲染,直接改造下element-ui的走马灯,实现类似的效果,最主要的是后续会迭代到vue3,所以这里临时的实现下即可; 内容 元素绑定ref 给需要监听的元素添加 </el-carousel-item> </component>

    监听元素 leftNav 为左边侧边栏数据,当点击添加的时候会塞入相应的数据,监听该数据变化即可; 主要还是基于MutationObserver来实现监听; watch: { leftNav:

    45910编辑于 2024-08-15
  • 来自专栏SpringCloud专栏

    2 监听mysql表内容变化,使用canal

    canal是阿里开源的一个中间件,它就是通过解析binlog来完成数据变更的监听的。 https://github.com/alibaba/canal ? 同时canal有一个client工程,通过添加client的sdk,我们就可以在项目里监听到server端传来的数据变更信息,从而达到监听数据变化的目的。 ################################################# address设置为mysql的连接地址,defaultDatabaseName设置为自己要监听的库名 canal客户端编写 服务端启动完毕后,在客户端即可监听test库的变化。 如果你在这里新建个目录abc,目录里也放一个instance.properties,那么就可以在客户端监听abc。 启动客户端,查看控制台输出。 ?

    7.2K40发布于 2019-01-17
  • 【vue】 vue2 监听滚动条滚动事件

    }, }, }; </script> <style lang="scss" scoped> .content { height: 300px; border: 2px

    16810编辑于 2025-12-15
  • 来自专栏程序技术知识

    js监听模式模拟事件监听

    }); myEvent.addEventListener("click",method); function method(){ console.log("函数2"

    22.1K30编辑于 2022-03-19
  • 来自专栏从ORACLE起航,领略精彩的IT技术。

    Oracle 11gR2 RAC修改监听默认端口

    listener port 1.Modify SCAN listener port: $GRID_HOME/bin/srvctl modify scan_listener -p Update 11gR2 Storage Management, OLAP, Data Mining and Real Application Testing options 1.2 重启SCAN listener生效新端口 2. Port: TCP:1522 二、修改Listener Ports 首先获取当前你的监听程序的配置信息. DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.99.194)(PORT=1522))))' scope=both sid='racdb2' 2.3 重新启动监听程序 监听重新启动后,对应配置文件才会更改。

    1.9K50发布于 2019-05-24
  • 来自专栏浅谈电商系统的实践经验

    消息队列(2)--如何利用事务消息实现分布式事务

    1.怎么使用事务消息实现分布式事务消息队列中的“事务”,主要解决的是消息生产者和消息消费者的数据一致性问题应用场景:订单系统下订单后,需要在购物车系统清空购物车事务消息适用的场景主要是那些需要异步更新数据 方案:1.TCC 2PC 3PC Saga(强一致性,并发量不发的情况下使用,比如下订单和使用优惠券)2.可以使用本地消息表实现最终一致性(可以短时间接受不一致,前提是:异步执行的部分不依赖资源)3.使用支持事务的消息中间件 RocketMQ Kafka(本地消息表思想的一种实现,使用起来更简单)具体以方案3事务消息实现分布式消息为例:图片1.开启事务2.发送半消息3.成功后执行本地事务,创建订单4.本地事务执行成功,则提交事务 ;本地事务执行失败,则回滚事务细心的同学发现步骤4:如果本地事务执行成功,提交事务的时候,请求失败了,怎么办? RocketMQ 会自动根据事务反查的结果提交或者回滚事务消息。图片2.怎么保证消息顺序消费?

    1K30编辑于 2023-10-03
  • 来自专栏Postgresql源码分析

    Postgresql实验系列(2)批量获取事务ID

    2 改造前 (性能数据没有太大参考意义,只用于前后对比) 16C小规格测试机128并发压测,PG参数全部异步写,瓶颈来到事务ID生成 128并发压测只写120秒XidGen锁每秒的出现数量:均值在60左右 = 80589 -- 参数 fsync = off synchronous_commit = off autovacuum = off create table testbl1(c1 int, c2 3.1 改造方案一 【本地进程】拿事务ID从一次拿一个变成一次拿N个,其他不变。 关键改造点: GetNewTransactionId:预存本地N个事务ID,取的时候先取本地,再去共享的。 GetSnapshotData:要求事务ID必须严格递增,这里可能会有空洞触发assert。 3.2 改造方案二(较复杂不做测试) 拿事务ID由每个进程自己拿,变成由一个进程统一分配。

    61110编辑于 2022-11-06
  • 来自专栏拂晓风起

    cocos2d-js 自定义事件监听派发

    cc.eventManager有两种注册监听器的方式,一种是原生事件,例如 cc.eventManager.addListener({ event: cc.EventListener.KEYBOARD 触发自定义事件的方式,也跟js和flash一致: cc.eventManager.dispatchCustomEvent("xxxxxevent", {a:1,b:2}); 通过这个dispatch就能得到上边图片所示的内容

    3.1K30发布于 2018-07-03
  • 来自专栏睿Talks

    React 源码深度解读(八):事务 - Part 2

    React 15.4.2 ,以下是本系列其它文章的传送门: React 源码深度解读(一):首次 DOM 元素渲染 - Part 1 React 源码深度解读(二):首次 DOM 元素渲染 - Part 2 源码深度解读(三):首次 DOM 元素渲染 - Part 3 React 源码深度解读(四):首次自定义组件渲染 - Part 1 React 源码深度解读(五):首次自定义组件渲染 - Part 2 React 源码深度解读(六):依赖注入 React 源码深度解读(七):事务 - Part 1 React 源码深度解读(八):事务 - Part 2 React 源码深度解读(九):单个元素更新 React

    39320编辑于 2022-06-14
  • 来自专栏快乐阿超

    r2dbc事务处理

    ——恩格斯 官方demo: https://github.com/spring-projects/spring-data-examples/blob/main/r2dbc/example/src/main /java/example/springdata/r2dbc/basics/TransactionalService.java /* * Copyright 2019-2021 the original IllegalStateException(); } else { return it; } }); } } 可以看到是支持Transactional的 当然我们可以手动回滚事务 ,配置: import io.r2dbc.spi.ConnectionFactory; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.r2dbc.connection.R2dbcTransactionManager

    57220编辑于 2023-10-31
  • 领券