爆款云主机2核4G限时秒杀,88元/年起!
查看详情

活动

天翼云最新优惠活动,涵盖免费试用,产品折扣等,助您降本增效!
热门活动
  • 618智算钜惠季 爆款云主机2核4G限时秒杀,88元/年起!
  • 免费体验DeepSeek,上天翼云息壤 NEW 新老用户均可免费体验2500万Tokens,限时两周
  • 云上钜惠 HOT 爆款云主机全场特惠,更有万元锦鲤券等你来领!
  • 算力套餐 HOT 让算力触手可及
  • 天翼云脑AOne NEW 连接、保护、办公,All-in-One!
  • 中小企业应用上云专场 产品组合下单即享折上9折起,助力企业快速上云
  • 息壤高校钜惠活动 NEW 天翼云息壤杯高校AI大赛,数款产品享受线上订购超值特惠
  • 天翼云电脑专场 HOT 移动办公新选择,爆款4核8G畅享1年3.5折起,快来抢购!
  • 天翼云奖励推广计划 加入成为云推官,推荐新用户注册下单得现金奖励
免费活动
  • 免费试用中心 HOT 多款云产品免费试用,快来开启云上之旅
  • 天翼云用户体验官 NEW 您的洞察,重塑科技边界

智算服务

打造统一的产品能力,实现算网调度、训练推理、技术架构、资源管理一体化智算服务
智算云(DeepSeek专区)
科研助手
  • 算力商城
  • 应用商城
  • 开发机
  • 并行计算
算力互联调度平台
  • 应用市场
  • 算力市场
  • 算力调度推荐
一站式智算服务平台
  • 模型广场
  • 体验中心
  • 服务接入
智算一体机
  • 智算一体机
大模型
  • DeepSeek-R1-昇腾版(671B)
  • DeepSeek-R1-英伟达版(671B)
  • DeepSeek-V3-昇腾版(671B)
  • DeepSeek-R1-Distill-Llama-70B
  • DeepSeek-R1-Distill-Qwen-32B
  • Qwen2-72B-Instruct
  • StableDiffusion-V2.1
  • TeleChat-12B

应用商城

天翼云精选行业优秀合作伙伴及千余款商品,提供一站式云上应用服务
进入甄选商城进入云市场创新解决方案
办公协同
  • WPS云文档
  • 安全邮箱
  • EMM手机管家
  • 智能商业平台
财务管理
  • 工资条
  • 税务风控云
企业应用
  • 翼信息化运维服务
  • 翼视频云归档解决方案
工业能源
  • 智慧工厂_生产流程管理解决方案
  • 智慧工地
建站工具
  • SSL证书
  • 新域名服务
网络工具
  • 翼云加速
灾备迁移
  • 云管家2.0
  • 翼备份
资源管理
  • 全栈混合云敏捷版(软件)
  • 全栈混合云敏捷版(一体机)
行业应用
  • 翼电子教室
  • 翼智慧显示一体化解决方案

合作伙伴

天翼云携手合作伙伴,共创云上生态,合作共赢
天翼云生态合作中心
  • 天翼云生态合作中心
天翼云渠道合作伙伴
  • 天翼云代理渠道合作伙伴
天翼云服务合作伙伴
  • 天翼云集成商交付能力认证
天翼云应用合作伙伴
  • 天翼云云市场合作伙伴
  • 天翼云甄选商城合作伙伴
天翼云技术合作伙伴
  • 天翼云OpenAPI中心
  • 天翼云EasyCoding平台
天翼云培训认证
  • 天翼云学堂
  • 天翼云市场商学院
天翼云合作计划
  • 云汇计划
天翼云东升计划
  • 适配中心
  • 东升计划
  • 适配互认证

开发者

开发者相关功能入口汇聚
技术社区
  • 专栏文章
  • 互动问答
  • 技术视频
资源与工具
  • OpenAPI中心
开放能力
  • EasyCoding敏捷开发平台
培训与认证
  • 天翼云学堂
  • 天翼云认证
魔乐社区
  • 魔乐社区

支持与服务

为您提供全方位支持与服务,全流程技术保障,助您轻松上云,安全无忧
文档与工具
  • 文档中心
  • 新手上云
  • 自助服务
  • OpenAPI中心
定价
  • 价格计算器
  • 定价策略
基础服务
  • 售前咨询
  • 在线支持
  • 在线支持
  • 工单服务
  • 建议与反馈
  • 用户体验官
  • 服务保障
  • 客户公告
  • 会员中心
增值服务
  • 红心服务
  • 首保服务
  • 客户支持计划
  • 专家技术服务
  • 备案管家

了解天翼云

天翼云秉承央企使命,致力于成为数字经济主力军,投身科技强国伟大事业,为用户提供安全、普惠云服务
品牌介绍
  • 关于天翼云
  • 智算云
  • 天翼云4.0
  • 新闻资讯
  • 天翼云APP
基础设施
  • 全球基础设施
  • 信任中心
最佳实践
  • 精选案例
  • 超级探访
  • 云杂志
  • 分析师和白皮书
  • 天翼云·创新直播间
市场活动
  • 2025智能云生态大会
  • 2024智算云生态大会
  • 2023云生态大会
  • 2022云生态大会
  • 天翼云中国行
天翼云
  • 活动
  • 智算服务
  • 产品
  • 解决方案
  • 应用商城
  • 合作伙伴
  • 开发者
  • 支持与服务
  • 了解天翼云
      • 文档
      • 控制中心
      • 备案
      • 管理中心

      Spring系列之事务、@Transactional原理及失效场景

      首页 知识中心 软件开发 文章详情页

      Spring系列之事务、@Transactional原理及失效场景

      2023-06-14 09:11:42 阅读次数:459

      spring,事务

      概要

      Spring事务基于数据库事务,JDBC事务过程:

      1. 获取连接​​Connection con = DriverManager.getConnection()​​
      2. 开启事务​​con.setAutoCommit(true/false);​​
      3. 执行CRUD
      4. 提交事务/回滚事务​​con.commit()​​​, ​​con.rollback();​​
      5. 关闭连接​​conn.close();​​

      Spring事务主要分为两种:

      1. 编程式事务
      2. 声明式事务

      编程式事务

      try {
      // something
      transactionManager.commit();
      } catch (Exception e) {
      transactionManager.rollback();
      throw new RuntimeException("失败");
      }

      显而易见,代码侵入性比较强,代码冗余。

      声明式事务

      使用Spring声明式事务,可以不再写步骤2和4的代码。基于AOP,有两种实现方式:基于TX和AOP的xml配置文件方式、基于@Transactional注解的形式。配置文件开启注解驱动,在类和方法上通过注解@Transactional标识。Spring在启动时会去解析并生成相关的bean,为这些类和方法生成代理,并根据@Transaction的相关参数进行相关配置注入,这样就在代理中把相关的事务处理掉(开启正常提交事务,异常回滚事务)。真正的数据库层的事务提交和回滚是通过binlog或redo log实现。

      Transactional

      @Transactional可作用在接口、类、方法:

      • 类:表示该类所有的public方法都配置相同的事务属性信息
      • 方法:方法的事务优先级更高,会覆盖类的事务配置信息
      • 接口:不推荐这种使用方法,因为一旦标注在Interface上并且配置Spring AOP使用CGLib动态代理,将会导致@Transactional注解失效

      属性

      @Transactional注解有哪些属性?

      1. propagation,事务的传播行为,包括7种枚举值;
      2. isolation,事务的隔离级别,枚举值有5个,Isolation.DEFAULT:默认值,即使用底层数据库的隔离级别,其他四种即为MySQL的四种隔离级别。源码在DataSourceUtils:
      // Apply specific isolation level, if any.
      Integer previousIsolationLevel = null;
      if (definition != null && definition.getIsolationLevel() != TransactionDefinition.ISOLATION_DEFAULT) {
      int currentIsolation = con.getTransactionIsolation();
      if (currentIsolation != definition.getIsolationLevel()) {
      previousIsolationLevel = currentIsolation;
      con.setTransactionIsolation(definition.getIsolationLevel());
      }
      }
      1. timeout,事务超时时间,默认值为​​-1​​。如果超过该时间限制但事务还没有完成,则自动回滚事务
      2. readOnly,指定事务是否为只读事务,默认值为 false;为了忽略那些不需要事务的方法,比如读取数据,可以设置 read-only 为 true
      3. rollbackFor,指定触发事务回滚的异常类型,可指定多个异常类型
      4. noRollbackFor,指定不触发事务回滚的异常类型,可指定多个异常类型
      5. transactionManager,事务管理器,用于配置有多数据源,即多事务管理器情况下具体指定某一个事务管理器

      事务传播性

      事务的传播性一般在事务嵌套时候使用,比如在事务A里面调用另外一个使用事务的方法,那么这俩个事务是各自作为独立的事务执行提交,还是内层的事务合并到外层的事务一块提交那,这就是事务传播性要确定的问题。

      Spring事务的传播属性,即多个事务同时存在时,Spring应该如何处理这些事务的行为。亦多个事务方法相互调用时,事务如何在这些方法间传播。这些属性在TransactionDefinition接口中定义:

      • PROPAGATION_REQUIRED:默认值。如果当前存在事务,则加入该事务,如果不存在,则创建一个新的事务。(也就是说如果A方法和B方法都添加注解,在默认传播模式下,A方法内部调用B方法,会把两个方法的事务合并为一个事务 )
      • PROPAGATION_SUPPORTS:如果当前存在事务,则加入该事务;如果当前不存在事务,则以非事务的方式继续运行
      • PROPAGATION_MANDATORY:如果当前存在事务,则加入该事务;如果当前不存在事务,则抛出异常
      • PROPAGATION_REQUIRES_NEW:重新创建一个新的事务,如果当前存在事务,暂停当前的事务。新建的事务将和被挂起的事务没有任何关系,是两个独立的事务,外层事务失败回滚之后,不能回滚内层事务执行的结果,内层事务失败抛出异常,外层事务捕获,也可以不处理回滚操作。(当类A中的a方法用默认Propagation.REQUIRED模式,类B中的b方法加上采用Propagation.REQUIRES_NEW模式,然后在a方法中调用b方法操作数据库,然而a方法抛出异常后,b方法并没有进行回滚,因为Propagation.REQUIRES_NEW会暂停a方法的事务)
      • PROPAGATION_NOT_SUPPORTED:以非事务的方式运行,如果当前存在事务,暂停当前的事务
      • PROPAGATION_NEVER:以非事务的方式运行,如果当前存在事务,则抛出异常
      • PROPAGATION_NESTED:如果一个活动的事务存在,则运行在一个嵌套的事务中。如果没有活动事务,则按REQUIRED属性执行。它使用一个单独的事务,这个事务拥有多个可以回滚的保存点。内部事务的回滚不会对外部事务造成影响。它只对DataSourceTransactionManager事务管理器起效

      隔离级别

      • ISOLATION_DEFAULT:PlatfromTransactionManager默认隔离级别,使用数据库默认的事务隔离级别。另外四个与JDBC相对应;
      • ISOLATION_READ_UNCOMMITTED:最低,它充许别外一个事务可以看到这个事务未提交的数据。会产生脏读,不可重复读和幻读;
      • ISOLATION_READ_COMMITTED:保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据。可避免脏读,但可能会出现不可重复读和幻读;
      • ISOLATION_REPEATABLE_READ:可防止脏读,不可重复读。但可能出现幻像读。它除了保证一个事务不能读取另一个事务未提交的数据外,还保证避免下面的情况产生(不可重复读);
      • ISOLATION_SERIALIZABLE:花费最高代价但最可靠。事务被处理为顺序执行。除了防止脏读,不可重复读外,还避免幻读

      readOnly

      指定事务是否为只读事务,默认值为false。设置为true,需要底层数据库支持。
      对MySQL来说,有两种提交模式:

      • ​​SET AUTOCOMMIT=0​​:禁止自动提交
      • ​​SET AUTOCOMMIT=1​​:开启自动提交

      若开启事务,AUTOCOMMIT要为false,Spring源码处理:

      con.setAutoCommit(false);
      // 只读事务
      if (isEnforceReadOnly() && definition.isReadOnly()) {
      try (Statement stmt = con.createStatement()) {
      stmt.executeUpdate("SET TRANSACTION READ ONLY");
      }
      }

      不加@Transaction注解,默认是不开启事务。单条查询语句也没有必要开启事务,数据库默认的配置就能满足需求。但一次执行多条查询语句,如统计查询,报表查询;此时多条查询SQL必须保证整体的读一致性,否则,在前条SQL查询之后,后条SQL查询之前,数据被其他用户改变,就会造成数据的前后不一。需要开启读事务。

      不生效

      不生效的几种场景:

      1. 底层数据库引擎不支持事务

      若数据库引擎不支持事务,则Spring自然无法支持事务

      2. propagation设置错误

      当Spring开启事务并设置传播机制,覆盖MySQL已有的事务隔离级别。如果MySQL不支持该隔离级别,Spring的事务就也不会生效。和第一点比较类似,但是不尽相同。三种配置将会导致事务失效:

      • TransactionDefinition.PROPAGATION_SUPPORTS:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行
      • TransactionDefinition.PROPAGATION_NOT_SUPPORTED:以非事务方式运行,如果当前存在事务,则把当前事务挂起
      • TransactionDefinition.PROPAGATION_NEVER:以非事务方式运行,如果当前存在事务,则抛出异常

      3. 非public方法

      在非public方法上标记@Transactional,不报错(可以通过编译,但是IDEA有警告),没有事务功能。因为Transactional事务基于AOP,动态代理只能针对public方法进行代理;而不管使用JDK还是CGlib动态代理。AbstractFallbackTransactionAttributeSource类源码如下:

      protected TransactionAttribute computeTransactionAttribute(Method method, @Nullable Class<?> targetClass) {
      // Don't allow no-public methods as required.
      if (this.allowPublicMethodsOnly() && !Modifier.isPublic(method.getModifiers())) {
      return null;
      }
      }

      另外方法的修饰符不能有final,static:

      Spring系列之事务、@Transactional原理及失效场景

      4. 异常被catch

      在整个事务的方法中使用try-catch,导致异常无法抛出,自然会导致事务失效。

      @Transactional
      public void methodA() {
      try {
      // do some transaction of A
      // call B to do another transaction
      methodB();
      } catch (Exception ex) {
      return;
      }
      }

      会抛出异常:
      ​​​org.springframework.transaction.UnexpectedRollbackException: Transaction rolled back because it has been marked as rollback-only​​。

      因为当ServiceB中抛出一个异常以后,ServiceB标识当前事务需要rollback。但是ServiceA中由于你手动的捕获这个异常并进行处理,ServiceA认为当前事务应该正常commit。此时就出现前后不一致,抛出UnexpectedRollbackException异常。

      spring的事务是在调用业务方法之前开始的,业务方法执行完毕之后才执行commit or rollback,事务是否执行取决于是否抛出runtime异常。如果抛出runtime exception 并在你的业务方法中没有catch到的话,事务会回滚。

      在业务方法中一般不需要catch异常,如果非要catch一定要抛出throw new RuntimeException(),或者注解中指定抛异常类型@Transactional(rollbackFor=Exception.class),否则会导致事务失效,数据commit造成数据不一致,所以有些时候try catch反倒会画蛇添足。

      5. rollbackFor属性设置错误

      指定异常触发回滚,但是设置错误导致一些异常不能触发回滚。rollbackFor可以指定能够触发事务回滚的异常类型。Spring默认抛出未检查unchecked异常(继承自RuntimeException的异常)或Error才回滚事务;其他异常不会触发回滚事务。源码:

      private int getDepth(Class<?> exceptionClass, int depth) {
      if (exceptionClass.getName().contains(this.exceptionName)) {
      // Found it!
      return depth;
      }
      // If we've gone as far as we can go and haven't found it...
      if (exceptionClass == Throwable.class) {
      return -1;
      }
      return getDepth(exceptionClass.getSuperclass(), depth + 1);
      }

      6. noRollbackFor属性设置错误

      和rollbackFor类似。

      7. 方法中调用同类的方法

      最复杂的情况。一个类中的A方法(无注解@Transactional)在内部调用B方法(有注解@Transactional,不论方法B是用public还是private修饰),这样会导致B方法中的事务失效。

      简单来说,由于使用Spring AOP代理造成的,因为只有当事务方法被当前类以外的代码调用时,才会由Spring生成的代理对象来管理。

      具体来说,Spring在扫描Bean时会自动为标注@Transactional注解的类生成一个代理类,当有注解的方法被调用的时候,实际上是代理类调用的,代理类在调用之前会开启事务,执行事务的操作,但是同类中的方法互相调用,相当于​​this.B()​​,此时的B方法并非是代理类调用,而是直接通过原有的Bean直接调用,所以注解会失效。即并不通过创建代理对象进行调用,所以并不会进入TransactionInterceptor的invoke方法,不会开启事务。

      8.未加类注解标记为Spring Bean

      没啥好说的。。一般情况下会出现应用启动失败。。

      9.应用未开启事务

      没啥好说的,写这么多,主要是面试官一个比一个恶心。这种情况在遗留Spring老项目中可能会出现。

      10.多线程调用

      @Service
      public class UserService {
      @Resource
      private UserMapper userMapper;
      @Resource
      private RoleService roleService;

      @Transactional
      public void add(UserModel userModel) throws Exception {
      userMapper.insertUser(userModel);
      new Thread(() -> {
      roleService.doOtherThing();
      }).start();
      }
      }

      @Service
      public class RoleService {
      @Transactional
      public void doOtherThing() {
      System.out.println("保存role表数据");
      }
      }

      事务方法add中,调用事务方法doOtherThing,但事务方法doOtherThing是在另外一个线程中调用的。

      这样会导致两个方法不在同一个线程中,获取到的数据库连接不一样,从而是两个不同的事务。如果想doOtherThing方法中抛异常,add方法也回滚是不可能的。

      Spring的事务是通过数据库连接来实现的。当前线程中保存一个map,key是数据源,value是数据库连接:
      ​​​private static final ThreadLocal<Map<Object, Object>> resources = new NamedThreadLocal<>("Transactional resources");​​ 同一个事务,其实是指同一个数据库连接,只有拥有同一个数据库连接才能同时提交和回滚。如果在不同的线程,拿到的数据库连接肯定是不一样的,所以是不同的事务。

      建议

      正确的使用Transactional注解需要做到如下四点:

      • 不要在类上标注Transactional注解,要在需要的方法上标注。即使类的每个方法都需要事务也不要在类上标注,因为有可能你或别人新添加的方法根本不需要事务;
      • 标注Transactional注解的方法体中不要涉及耗时很久的操作,如IO操作、网络通信等;
      • 根据业务需要设置合适的事务参数,如是否需要新事务、超时时间等;
      • 控制事务影响的范围,代码中减少事务影响的代码。

      原理

      Spring容器在初始化每个单例bean的时候,会遍历容器中的所有BeanPostProcessor实现类,并执行其postProcessAfterInitialization方法,在执行AbstractAutoProxyCreator类的postProcessAfterInitialization方法时会遍历容器中所有的切面,查找与当前实例化bean匹配的切面,这里会获取事务属性切面,查找@Transactional注解及其属性值,然后根据得到的切面创建一个代理对象,默认是使用JDK动态代理创建代理,如果目标类是接口,则使用JDK动态代理,否则使用Cglib。在创建代理的过程中会获取当前目标方法对应的拦截器,此时会得到TransactionInterceptor实例,在它的invoke方法中实现事务的开启和回滚,在需要进行事务操作的时候,Spring会在调用目标类的目标方法之前进行开启事务、调用异常回滚事务、调用完成会提交事务。是否需要开启新事务,是根据@Transactional注解上配置的参数值来判断的。如果需要开启新事务,获取Connection连接,然后将连接的自动提交事务改为false,改为手动提交。当对目标类的目标方法进行调用的时候,若发生异常将会进入completeTransactionAfterThrowing方法。

      如果在类A上标注Transactional注解,Spring容器会在启动的时候,为类A创建一个代理类B,类A的所有public方法都会在代理类B中有一个对应的代理方法,调用类A的某个public方法会进入对应的代理方法中进行处理;如果只在类A的b方法(使用public修饰)上标注Transactional注解,Spring容器会在启动的时候,为类A创建一个代理类B,但只会为类A的b方法创建一个代理方法,调用类A的b方法会进入对应的代理方法中进行处理,调用类A的其它public方法,则还是进入类A的方法中处理。在进入代理类的某个方法之前,会先执行TransactionInterceptor类中的invoke方法,完成整个事务处理的逻辑,如是否开启新事务、在目标方法执行期间监测是否需要回滚事务、目标方法执行完成后提交事务等。

      PlatformTransactionManager,基于AOP的类TransactionAspectSupport:
      核心属性:

      private static final ThreadLocal<TransactionInfo> transactionInfoHolder = new NamedThreadLocal<>("Current aspect-driven transaction");

      核心方法invokeWithinTransaction():

       

      getTransaction():

      @Override
      public final TransactionStatus getTransaction(@Nullable TransactionDefinition definition) throws TransactionException {
      // Use defaults if no transaction definition given.
      TransactionDefinition def = (definition != null ? definition : TransactionDefinition.withDefaults());
      Object transaction = doGetTransaction();
      boolean debugEnabled = logger.isDebugEnabled();
      if (isExistingTransaction(transaction)) {
      // Existing transaction found -> check propagation behavior to find out how to behave.
      return handleExistingTransaction(def, transaction, debugEnabled);
      }
      // Check definition settings for new transaction.
      if (def.getTimeout() < TransactionDefinition.TIMEOUT_DEFAULT) {
      thrownew InvalidTimeoutException("Invalid transaction timeout", def.getTimeout());
      }
      // No existing transaction found -> check propagation behavior to find out how to proceed.
      if (def.getPropagationBehavior() == TransactionDefinition.PROPAGATION_MANDATORY) {
      thrownew IllegalTransactionStateException(
      "No existing transaction found for transaction marked with propagation 'mandatory'");
      }
      elseif (def.getPropagationBehavior() == TransactionDefinition.PROPAGATION_REQUIRED ||
      def.getPropagationBehavior() == TransactionDefinition.PROPAGATION_REQUIRES_NEW ||
      def.getPropagationBehavior() == TransactionDefinition.PROPAGATION_NESTED) {
      SuspendedResourcesHolder suspendedResources = suspend(null);
      try {
      // 核心
      return startTransaction(def, transaction, debugEnabled, suspendedResources);
      }
      catch (RuntimeException | Error ex) {
      resume(null, suspendedResources);
      throw ex;
      }
      }
      else {
      // Create "empty" transaction: no actual transaction, but potentially synchronization.
      if (def.getIsolationLevel() != TransactionDefinition.ISOLATION_DEFAULT && logger.isWarnEnabled()) {
      logger.warn("Custom isolation level specified but no actual transaction initiated; " +
      "isolation level will effectively be ignored: " + def);
      }
      boolean newSynchronization = (getTransactionSynchronization() == SYNCHRONIZATION_ALWAYS);
      return prepareTransactionStatus(def, null, true, newSynchronization, debugEnabled, null);
      }
      }

      事务拦截器

      PlatformTransactionManager是Spring 中的事务管理接口,真正定义事务如何回滚和提交。

      TransactionInterceptor,负责拦截方法执行,判断是否需要提交或者回滚事务。

      Spring系列之事务、@Transactional原理及失效场景

      参考

      ​​Spring事务处理时自我调用的解决方案及一些实现方式的风险​​​​6种@Transactional注解失效场景​​​​聊聊Spring事务失效的12种场景​​​​Spring声明式事务处理的实现原理​​

      版权声明:本文内容来自第三方投稿或授权转载,原文地址:https://blog.51cto.com/u_15851118/5805391,作者:johnny233,版权归原作者所有。本网站转在其作品的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如因作品内容、版权等问题需要同本网站联系,请发邮件至ctyunbbs@chinatelecom.cn沟通。

      上一篇:Spring-data-jpa介绍

      下一篇:Spring核心思想

      相关文章

      2025-05-14 10:02:48

      SQL Server 事务日志体系结构1--基本术语

      事务包括对数据库的一次更改或一系列更改。它有一个明确开始和明确结束。开始时使用BEGIN TRANSACTION语句,或者SQL Server会自动为您开始一个事务。

      2025-05-14 10:02:48
      Server , SQL , 事务 , 数据库 , 日志 , 磁盘
      2025-05-13 09:49:12

      JDBC事务管理、四大特征(ACID)、事务提交与回滚、MySQL事务管理

      JDBC(Java Database Connectivity)事务是指一系列作为单个逻辑工作单元执行的数据库操作,这些操作要么全部成功——>提交,要么全部失败——>回滚,从而确保数据的一致性和完整性。

      2025-05-13 09:49:12
      MySQL , 事务 , 执行 , 提交 , 操作 , 数据库
      2025-05-08 09:03:21

      基于spring+jsp+mysql实现的Java web论坛系统【源码+数据库+指导运行】

      本项目是一套基于spring+jsp+mysql实现的Java web论坛系统,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者。

      2025-05-08 09:03:21
      Java , jsp , spring , 功能 , 源码
      2025-05-08 09:03:07

      spring Bean的作用域和生命周期

      spring Bean的作用域和生命周期

      2025-05-08 09:03:07
      Bean , method , spring , 作用域 , 配置文件
      2025-05-07 09:08:54

      springboot系列教程(十二):基于转账案例,演示事务管理操作

      springboot系列教程(十二):基于转账案例,演示事务管理操作

      2025-05-07 09:08:54
      spring , 事务 , 接口 , 管理器 , 配置
      2025-05-06 09:19:12

      Spring多线程事务 能否保证事务的一致性(同时提交、同时回滚)?

      Spring的事务信息是存在ThreadLocal中的Connection, 所以一个线程永远只能有一个事务

      2025-05-06 09:19:12
      Spring , 事务 , 多线程 , 线程
      2025-04-22 09:28:19

      61. Spring事务传播行为实现原理

      61. Spring事务传播行为实现原理

      2025-04-22 09:28:19
      Spring , ThreadLocal , 事务
      2025-04-22 09:27:37

      【Redis】浅析 Redis 事务

      【Redis】浅析 Redis 事务

      2025-04-22 09:27:37
      redis , Redis , 事务 , 命令 , 执行
      2025-04-15 09:19:55

      分布式事务大揭秘:使用MQ实现最终一致性

      在单体应用中,事务的管理相对简单,可以通过数据库的事务机制来保证数据的一致性和完整性。然而,在分布式系统中,由于涉及到多个不同的服务和数据源,保证事务的一致性就变得复杂了。

      2025-04-15 09:19:55
      RocketMQ , 一致性 , 事务 , 分布式 , 发送 , 消息 , 系统
      2025-04-14 08:48:01

      Java注解实现之how to use path variable @PathVariable

      Java注解实现之how to use path variable @PathVariable

      2025-04-14 08:48:01
      Java , spring
      查看更多
      推荐标签

      作者介绍

      天翼云小翼
      天翼云用户

      文章

      33561

      阅读量

      5237775

      查看更多

      最新文章

      基于spring+jsp+mysql实现的Java web论坛系统【源码+数据库+指导运行】

      2025-05-08 09:03:21

      springboot系列教程(十二):基于转账案例,演示事务管理操作

      2025-05-07 09:08:54

      Spring多线程事务 能否保证事务的一致性(同时提交、同时回滚)?

      2025-05-06 09:19:12

      61. Spring事务传播行为实现原理

      2025-04-22 09:28:19

      Java注解实现之how to use path variable @PathVariable

      2025-04-14 08:48:01

      Java SpringBoot 应用使用命令行 mvn spring-boot run 启动的原理

      2025-04-14 08:45:36

      查看更多

      热门文章

      SpringMVC的JSON处理及FastJSON的整合使用(七)

      2022-12-27 10:00:39

      Java(Spring拦截器、过滤器、AOP)

      2023-06-20 09:11:08

      基于XML的DI-为Spring配置多个子配置文件——平等关系

      2022-12-29 09:29:46

      Spring AOP-有接口的CGLIB动态代理

      2022-12-29 09:29:46

      基于注解的DI-Spring的JUnit4测试

      2022-12-29 09:29:46

      Spring5入门到实战------2、IOC容器底层原理

      2023-02-28 10:45:09

      查看更多

      热门标签

      java Java python 编程开发 代码 开发语言 算法 线程 Python html 数组 C++ 元素 javascript c++
      查看更多

      相关产品

      弹性云主机

      随时自助获取、弹性伸缩的云服务器资源

      天翼云电脑(公众版)

      便捷、安全、高效的云电脑服务

      对象存储

      高品质、低成本的云上存储服务

      云硬盘

      为云上计算资源提供持久性块存储

      查看更多

      随机文章

      Spring Data Redis + RabbitMQ - 基于 string 实现缓存、计数功能(同步数据)

      简单使用rabbitmq 和一些改进

      MongoDB 入门教程系列之三:使用 Restful API 操作 MongoDB

      【Spring】Spring 获取Bean对象 -- 对象装配( 属性注入、构造方法注入、set注入)

      Spring自定义属性编辑器及原理解释.md

      最新版Spring Security入门

      • 7*24小时售后
      • 无忧退款
      • 免费备案
      • 专家服务
      售前咨询热线
      400-810-9889转1
      关注天翼云
      • 旗舰店
      • 天翼云APP
      • 天翼云微信公众号
      服务与支持
      • 备案中心
      • 售前咨询
      • 智能客服
      • 自助服务
      • 工单管理
      • 客户公告
      • 涉诈举报
      账户管理
      • 管理中心
      • 订单管理
      • 余额管理
      • 发票管理
      • 充值汇款
      • 续费管理
      快速入口
      • 天翼云旗舰店
      • 文档中心
      • 最新活动
      • 免费试用
      • 信任中心
      • 天翼云学堂
      云网生态
      • 甄选商城
      • 渠道合作
      • 云市场合作
      了解天翼云
      • 关于天翼云
      • 天翼云APP
      • 服务案例
      • 新闻资讯
      • 联系我们
      热门产品
      • 云电脑
      • 弹性云主机
      • 云电脑政企版
      • 天翼云手机
      • 云数据库
      • 对象存储
      • 云硬盘
      • Web应用防火墙
      • 服务器安全卫士
      • CDN加速
      热门推荐
      • 云服务备份
      • 边缘安全加速平台
      • 全站加速
      • 安全加速
      • 云服务器
      • 云主机
      • 智能边缘云
      • 应用编排服务
      • 微服务引擎
      • 共享流量包
      更多推荐
      • web应用防火墙
      • 密钥管理
      • 等保咨询
      • 安全专区
      • 应用运维管理
      • 云日志服务
      • 文档数据库服务
      • 云搜索服务
      • 数据湖探索
      • 数据仓库服务
      友情链接
      • 中国电信集团
      • 189邮箱
      • 天翼企业云盘
      • 天翼云盘
      ©2025 天翼云科技有限公司版权所有 增值电信业务经营许可证A2.B1.B2-20090001
      公司地址:北京市东城区青龙胡同甲1号、3号2幢2层205-32室
      • 用户协议
      • 隐私政策
      • 个人信息保护
      • 法律声明
      备案 京公网安备11010802043424号 京ICP备 2021034386号