数据源使用错误导致MySQL事务失效分析

什么情况会导致@Transactional事务失效? 一个程序中不可能没有事务,而 Spring 中,事务的实现方式分为两种:编程式事务和声明式事务,又因为编程式事务实现相对麻烦,而声明式事务实现极其简单,所以在日常项目中,我们都会使用声明式事务 @Transactional 来实现事务。 阅读详情

1. 前言

在Java应用中使用MySQL数据库时,可能出现因为使用的数据源或数据库会话错误,导致事务失效的问题。

在Java应用中使用多数据源时,可能在执行SQL语句的不同阶段使用了不相同的数据源,导致事务失效,以下主要对此类问题进行分析。

在Java应用中访问MySQL服务时,涉及Java应用、网络传输、MySQL服务这三层,在每一层都可以对执行的SQL语句与事务操作进行监控与观测,涉及的内容如下图所示:

在这里插入图片描述

可参考以下相关内容:

内容链接
MySQL SQL语句与事务执行及日志分析https://blog.youkuaiyun.com/a82514921/article/details/126563449
tcpdump、Wireshark抓包分析MySQL SQL语句与事务执行https://blog.youkuaiyun.com/a82514921/article/details/126563471
Spring、MyBatis、Druid、MySQL不使用事务执行SQL语句分析https://blog.youkuaiyun.com/a82514921/article/details/126563515
Spring、MyBatis、Druid、MySQL使用事务执行SQL语句分析https://blog.youkuaiyun.com/a82514921/article/details/126563542
Spring、MyBatis、Druid、MySQL执行SQL语句与事务监控https://blog.youkuaiyun.com/a82514921/article/details/126563558
数据源使用错误导致MySQL事务失效分析https://blog.youkuaiyun.com/a82514921/article/details/126563573
TiDB乐观事务、悲观事务模型验证https://blog.youkuaiyun.com/a82514921/article/details/126563502

2. 示例项目

以下使用的示例项目下载地址为:https://github.com/Adrninistrator/DB-Transaction-test,使用说明可参考“README.md”,

相关的执行日志保存在DB-Transaction-test-log目录中,log-print_stack_trace_off目录中是未打印调用堆栈的日志,log-print_stack_trace_on目录中是打印调用堆栈的日志。

3. 验证环境

  • JDK版本

1.8

  • Spring版本

5.3.20

  • Mybatis版本

org.mybatis:mybatis:3.2.8
org.mybatis:mybatis-spring:1.2.2

  • Druid版本

1.2.10

  • MySQL Connector版本

8.0.29

  • MySQL版本

MariaDB 10.0.36

  • Spring事务传播机制

默认值REQUIRED

4. 使用多数据源时事务正常生效的使用方式

在示例项目的Spring XML配置文件中,定义了两个DruidDataSource数据源,分别为dataSource1、dataSource2。

为了方便使用,以上两个数据库源连接同一个数据库的同一个用户(不会影响验证效果)。

在Spring XML中,定义了分别使用两个数据源的SqlSessionFactoryBean与MapperScannerConfigurer:

通过SqlSessionFactoryBean的dataSource属性指定使用的数据源,通过mapperLocations指定扫描的MyBatis XML文件范围;

通过MapperScannerConfigurer的basePackage属性指定扫描的MyBatis Mapper接口所在的包。

以下为dataSource1对应的配置:

<bean id="ds1SqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="failFast" value="true"/>
    <property name="dataSource" ref="dataSource1"/>
    <property name="mapperLocations">
        <list>
            <value>classpath*:test/db/dao/ds1/*.xml</value>
        </list>
    </property>
</bean>

<bean id="ds1MapperScannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <property name="basePackage">
        <value>test.db.dao.ds1</value>
    </property>
    <property name="sqlSessionFactoryBeanName" value="ds1SqlSessionFactory"/>
</bean>

以下为dataSource2对应的配置:

<bean id="ds2SqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="failFast" value="true"/>
    <property name="dataSource" ref="dataSource2"/>
    <property name="mapperLocations">
        <list>
            <value>classpath*:test/db/dao/ds2/*.xml</value>
        </list>
    </property>
</bean>

<bean id="ds2MapperScannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <property name="basePackage">
        <value>test.db.dao.ds2</value>
    </property>
    <property name="sqlSessionFactoryBeanName" value="ds2SqlSessionFactory"/>
</bean>

通过以上配置,使用不同的MyBatis Mapper接口(及对应的MyBatis XML文件)时,相关的数据库操作会在对应的数据源中进行:

  • 使用test.db.dao.ds1包中的Ds1TaskLockMapper接口时,会使用数据源dataSource1执行相关数据库操作;

  • 使用test.db.dao.ds2包中的Ds2TaskLockMapper接口时,会使用数据源dataSource2执行相关数据库操作。

在Spring XML中,定义了分别使用两个数据源的事务管理器,事务管理器ds1TransactionManager使用数据源dataSource1,事务管理器ds2TransactionManager使用数据源dataSource2:

<bean id="ds1TransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource1"/>
</bean>

<bean id="ds2TransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource2"/>
</bean>

使用“tx:annotation-driven”指定开启通过注解使用事务,指定默认的事务管理器为routingTransactionManager:

<tx:annotation-driven transaction-manager="routingTransactionManager" proxy-target-class="true"/>

4.1. 多数据源不支持动态切换

4.1.1. 通过@Transactional注解使用事务

使用多数据源,不支持动态切换时,假如通过@Transactional注解使用事务,为了使事务生效,MyBatis Mapper接口对应的MapperScannerConfigurer的SqlSessionFactory,与@Transactional注解transactionManager属性指定的事务管理器,需要使用相同的数据源:

例如MyBatis Mapper接口使用数据源dataSource1对应的Ds1TaskLockMapper时,则@Transactional注解的事务管理器也需要使用数据源dataSource1对应的ds1TransactionManager;

MyBatis Mapper接口使用数据源dataSource2对应的Ds2TaskLockMapper时,则@Transactional注解的事务管理器也需要使用数据源dataSource2对应的ds2TransactionManager。

4.1.2. 通过TransactionTemplate使用事务

在Spring XML中,定义了两个事务模板TransactionTemplate,其事务管理器分别使用两个不同的数据源:

<bean id="ds1TransactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">
    <property name="transactionManager" ref="ds1TransactionManager"/>
</bean>

<bean id="ds2TransactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">
    <property name="transactionManager" ref="ds2TransactionManager"/>
</bean>

使用多数据源,不支持动态切换时,假如通过TransactionTemplate使用事务,为了使事务生效,MyBatis Mapper接口对应的MapperScannerConfigurer的SqlSessionFactory,与TransactionTemplate的事务管理器,需要使用相同的数据源:

例如MyBatis Mapper接口使用数据源dataSource1对应的Ds1TaskLockMapper时,则TransactionTemplate需要使用ds1TransactionTemplate,其事务管理器ds1TransactionManager对应的数据源为dataSource1;

MyBatis Mapper接口使用数据源dataSource2对应的Ds2TaskLockMapper时,则TransactionTemplate需要使用ds2TransactionTemplate,其事务管理器ds2TransactionManager对应的数据源为dataSource2。

4.2. 多数据源支持动态切换

在Spring XML中,定义了支持动态切换(路由)的数据源testRoutingDataSource,对应的类为test.db.datasource.TestRoutingDataSource(父类为Spring的org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource),指定默认数据源为dataSource1。通过targetDataSources属性指定,key为dataSourceKey1时,使用数据源dataSource1;key为dataSourceKey2时,使用数据源dataSource2:

<bean id="testRoutingDataSource" class="test.db.datasource.TestRoutingDataSource">
    <property name="defaultTargetDataSource" ref="dataSource1"/>
    <property name="targetDataSources">
        <map>
            <entry key="dataSourceKey1" value-ref="dataSource1"/>
            <entry key="dataSourceKey2" value-ref="dataSource2"/>
        </map>
    </property>
</bean>

在TestRoutingDataSource类中,通过ThreadLocal保存当前使用的数据源的key,重载AbstractRoutingDataSource类中决定使用的数据源key的determineCurrentLookupKey()方法,在该方法中返回了ThreadLocal的值,并提供了分别使用数据源dataSource1、dataSource2的方法setDSKey1()、setDSKey2():

public class TestRoutingDataSource extends AbstractRoutingDataSource {
    private static final ThreadLocal<String> threadLocalDSKey = new ThreadLocal<>();

    @Override
    protected Object determineCurrentLookupKey() {
        return threadLocalDSKey.get();
    }

    public static void setDSKey1() {
        setDSKey("dataSourceKey1");
    }

    public static void setDSKey2() {
        setDSKey("dataSourceKey2");
    }

    private static void setDSKey(String dataSourceKey) {
        threadLocalDSKey.set(dataSourceKey);
    }

    public static void clearDSKey() {
        threadLocalDSKey.remove();
    }
}

在Spring XML中,定义了使用以上数据源的SqlSessionFactoryBean与MapperScannerConfigurer:

<bean id="routingSqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="failFast" value="true"/>
    <property name="dataSource" ref="testRoutingDataSource"/>
    <property name="mapperLocations">
        <list>
            <value>classpath*:test/db/dao/routing/*.xml</value>
        </list>
    </property>
</bean>

<bean id="routingMapperScannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <property name="basePackage">
        <value>test.db.dao.routing</value>
    </property>
    <property name="sqlSessionFactoryBeanName" value="routingSqlSessionFactory"/>
</bean>

test.db.dao.routing包中的MyBatis Mapper接口为RoutingTaskLockMapper。

在Spring XML中,定义了使用以上数据源的事务管理器routingTransactionManager:

<bean id="routingTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="testRoutingDataSource"/>
</bean>

4.2.1. 通过@Transactional注解使用事务

使用多数据源支持动态切换时,假如通过@Transactional注解使用事务,为了使事务生效,MyBatis Mapper接口与@Transactional注解指定的事务管理器,都需要使用支持动态切换的数据源;且ThreadLocal需要使用相同的key:

MyBatis Mapper接口需要使用数据源testRoutingDataSource对应的RoutingTaskLockMapper;

@Transactional注解的事务管理器也需要使用数据源testRoutingDataSource对应的routingTransactionManager;

且执行数据库操作期间,TestRoutingDataSource中的ThreadLocal使用的key不能变化。

4.2.2. 通过TransactionTemplate使用事务

在Spring XML中,定义了使用以上事务管理器routingTransactionManager的事务模板routingTransactionTemplate:

<bean id="routingTransactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">
    <property name="transactionManager" ref="routingTransactionManager"/>
</bean>

使用多数据源支持动态切换时,假如通过TransactionTemplate使用事务,为了使事务生效,MyBatis Mapper接口与TransactionTemplate的事务管理器,都需要使用支持动态切换的数据源,且ThreadLocal需要使用相同的key:

MyBatis Mapper接口需要使用数据源testRoutingDataSource对应的RoutingTaskLockMapper;

TransactionTemplate的事务管理器也需要使用数据源testRoutingDataSource对应的routingTransactionManager;

且执行数据库操作期间,TestRoutingDataSource中的ThreadLocal使用的key不能变化。

5. 使用多数据源时事务失效问题

5.1. 导致事务失效的情况

  • 通过@Transactional注解使用事务

使用多数据源,且通过@Transactional注解使用事务时,假如MyBatis Mapper接口对应的MapperScannerConfigurer的SqlSessionFactory,与@Transactional注解指定的事务管理器,使用的数据源不相同,则事务会失效。

  • 通过TransactionTemplate使用事务

使用多数据源,且通过TransactionTemplate使用事务,假如MyBatis Mapper接口对应的MapperScannerConfigurer的SqlSessionFactory,与TransactionTemplate的事务管理器,使用的数据源不相同,则事务会失效。

例如使用的MyBatis Mapper接口对应的数据源为dataSource1,则@Transactional注解或TransactionTemplate的事务管理器的数据源不使用dataSource1时,事务就会失效(例如使用dataSource2或testRoutingDataSource)。

假如MyBatis Mapper接口对应的数据源为dataSource1,事务管理器的数据源使用testRoutingDataSource,且通过key指定内部使用数据源dataSource1,事务也会失效。

5.2. 事务失效时SQL语句执行情况

  • 事务执行过程中未出现异常

事务执行过程中未出现异常时,最后会提交事务。若事务失效,每条SQL语句执行后会立刻自动提交;

  • 事务执行过程中出现异常

事务执行过程中出现特定类型的异常时,最后会回滚事务。若事务失效,每条SQL语句执行后会立刻自动提交,且对数据库的修改操作不会回滚。

以上原因是Druid的com.alibaba.druid.pool.DruidPooledConnection类的rollback()方法中,判断成员变量TransactionInfo transactionInfo非null时才调用Connection conn的rollback()方法进行回滚,若为null则不执行回滚。

当事务失效时,以上成员变量为null,不会执行后续的回滚操作。

DruidPooledConnection.rollback()方法代码如下:

public void rollback() throws SQLException {
    if (transactionInfo == null) {
        return;
    }

    if (holder == null) {
        return;
    }

    DruidAbstractDataSource dataSource = holder.getDataSource();
    dataSource.incrementRollbackCount();

    try {
        conn.rollback();
    } catch (SQLException ex) {
        handleException(ex, null);
    } finally {
        handleEndTransaction(dataSource, null);
    }
}

6. 监控多数据源事务失效问题

在Java应用、网络传输、MySQL服务这三层,每一层可以使用的对SQL语句与事务执行的分析及监控方式不相同,可参考以下内容:

6.1. 在MySQL服务层监控事务失效问题

在MySQL服务层,可以通过一般查询日志(general_log)监控事务失效问题,对应MySQL的mysql.general_log表,thread_id列代表连接ID(MySQL服务线程ID)。

以上示例项目执行SQL语句出现事务失效问题时,查询mysql.general_log表的内容如下:

在这里插入图片描述

通过以上日志可以看出:

执行“SET autocommit=0”语句以开启事务的会话的连接ID为15;

执行“select for update”、“update”等SQL语句会话的连接ID为16,且该会话已开启自动提交;

执行“commit”语句以提交事务的会话的连接ID为15。

开启事务/提交事务,与执行SQL语句时使用的连接ID不同,不在同一个会话中,说明事务失效。

6.2. 在网络传输层监控事务失效问题

使用tcpdump或Wireshark抓包,可用于监控MySQL客户端与服务器之间的通信数据,即SQL语句的执行情况。

在Wireshark过滤器中输入“mysql and tcp.dstport==3306”过滤条件并应用,可指定只展示MySQL协议,且目标端口为3306,即MySQL客户端请求MySQL服务的数据。“Src port”列代表源端口。

以上示例项目执行SQL语句出现事务失效问题时,通过Wireshark抓包结果如下:

在这里插入图片描述

通过以上可以看出:

执行“SET autocommit=0”语句以开启事务的连接的源端口为52079;

执行“select for update”、“update”等SQL语句连接的源端口为52082,且该会话已开启自动提交;

执行“commit”语句以提交事务的连接的源端口为52079。

开启事务/提交事务,与执行SQL语句时使用的源端口不同,不属于同一个连接,即不在同一个会话中,说明事务失效。

6.3. 在Java应用层监控事务失效问题

使用Druid的自定义Filter,可对SQL语句及事务执行情况进行监控。

6.3.1. 人工分析

以上示例项目执行SQL语句出现事务失效问题时,Druid的自定义Filter打印的相关日志如下,可通过人工分析确认:

以下日志中的connThreadId代表连接ID,localPort代表源端口。

2022-07-11 21:11:10.984 [main] DEBUG DruidMonitorFilter.dataSource_getConnection(70) - ### [从连接池借出连接] connThreadId 121 dataSourceName ds2
SqlSessionInfo{connectionHashCode='54ee3737', connThreadId=121, localPort=65475, dataSourceName='ds2', autoCommit=true, serverIP='127.0.0.1', serverPort=3306, dbName='testdb', userName='test', serverVersion='5.5.5-10.0.36-MariaDB'}
2022-07-11 21:11:11.000 [main] DEBUG DruidMonitorFilter.connection_setAutoCommit(242) - ### [关闭自动提交] connThreadId 121 自动提交
SqlSessionInfo{connectionHashCode='54ee3737', connThreadId=121, localPort=65475, dataSourceName='ds2', autoCommit=true, serverIP='127.0.0.1', serverPort=3306, dbName='testdb', userName='test', serverVersion='5.5.5-10.0.36-MariaDB'}

以上执行关闭自动提交以开启事务的会话的连接ID为121,连接的源端口为65475;

2022-07-11 21:11:11.047 [main] DEBUG DruidMonitorFilter.dataSource_getConnection(70) - ### [从连接池借出连接] connThreadId 122 dataSourceName ds1
SqlSessionInfo{connectionHashCode='16f034a3', connThreadId=122, localPort=65476, dataSourceName='ds1', autoCommit=true, serverIP='127.0.0.1', serverPort=3306, dbName='testdb', userName='test', serverVersion='5.5.5-10.0.36-MariaDB'}
2022-07-11 21:11:11.063 [main] DEBUG DruidMonitorFilter.statementExecuteBefore(159) - ### [执行SQL语句] connThreadId 122 自动提交
select
        task_name, lock_flag, begin_time, end_time, process_info, now() as db_current_date
        from task_lock
        where task_name = ? for update
SqlSessionInfo{connectionHashCode='16f034a3', connThreadId=122, localPort=65476, dataSourceName='ds1', autoCommit=true, serverIP='127.0.0.1', serverPort=3306, dbName='testdb', userName='test', serverVersion='5.5.5-10.0.36-MariaDB'}
2022-07-11 21:11:11.079 [main] DEBUG DruidMonitorFilter.statementExecuteBefore(159) - ### [执行SQL语句] connThreadId 122 自动提交
update task_lock
        set
        lock_flag = ?,
        begin_time = now(),
        process_info = ?
        where task_name = ?
SqlSessionInfo{connectionHashCode='16f034a3', connThreadId=122, localPort=65476, dataSourceName='ds1', autoCommit=true, serverIP='127.0.0.1', serverPort=3306, dbName='testdb', userName='test', serverVersion='5.5.5-10.0.36-MariaDB'}

以上执行“select for update”、“update”等SQL语句连接的会话的连接ID为122,连接的源端口为65476;

2022-07-11 21:11:11.079 [main] DEBUG DruidMonitorFilter.connection_commit(188) - ### [提交事务] connThreadId 121 不自动提交 当前连接SQL语句执行次数: 0
SqlSessionInfo{connectionHashCode='54ee3737', connThreadId=121, localPort=65475, dataSourceName='ds2', autoCommit=false, serverIP='127.0.0.1', serverPort=3306, dbName='testdb', userName='test', serverVersion='5.5.5-10.0.36-MariaDB'}

以上执行提交事务的会话的连接ID为121,连接的源端口为65475。

开启事务/提交事务,与执行SQL语句时使用的连接ID不同,不在同一个会话中,说明事务失效。

6.3.2. 应用程序告警

在出现事务失效问题时,除了人工分析日志的方式外,在Druid的自定义Filter DruidMonitorFilter类中,也支持通过应用程序进行告警。

在DruidMonitorFilter类的statementExecuteBefore()方法中,判断执行SQL语句的连接ID与开启事务时的是否相同,若不同则说明出现事务失效问题,可以告警,输出的日志如下所示:

2022-07-11 21:11:11.063 [main] DEBUG DruidMonitorFilter.statementExecuteBefore(166) - @@@ 执行SQL语句的连接ID(MySQL服务线程ID)与开启事务时的不同 122@[ds1] 121@[ds2]
2022-07-11 21:11:11.079 [main] DEBUG DruidMonitorFilter.statementExecuteBefore(166) - @@@ 执行SQL语句的连接ID(MySQL服务线程ID)与开启事务时的不同 122@[ds1] 121@[ds2]

在DruidMonitorFilter类的statementExecuteBefore()方法中,判断提交事务时当前连接的SQL语句执行次数,若为0则说明可能出现事务失效问题,可以告警,输出的日志如下所示:

2022-07-11 21:11:11.079 [main] DEBUG DruidMonitorFilter.connection_commit(188) - ### [提交事务] connThreadId 121 不自动提交 当前连接SQL语句执行次数: 0
生产级机器学习系统:从模型上线到抗脆弱运维的全链路实践 机器学习模型部署不是开发终点,而是系统性工程挑战的起点。本文围绕生产环境中模型服务的稳定性、可观测性与可维护性展开,深入解析特征时效性、延迟预算、概念漂移、fallback机制、确定性推理等核心问题。基于金融风控、信贷审批等高压力场景,融合‘Towards AI’倡导的工程优先理念,系统阐述如何构建具备抗脆弱能力的ML系统——既保障毫秒级响应的业务生命线,又实现数据漂移可检测、故障退化可预期、决策过程可审计、合规要求可落地。关键词涵盖模型监控、特征漂移、延迟预算、fallback策略、生产级ML。 阅读详情

相关推荐

无感无刷电机控制进阶:反电动势过零检测的5种实现方案对比

本文深入探讨无感无刷电机控制中反电动势过零检测的5种实现方案,包括电阻分压虚拟中性点法、专用BEMF检测IC方案、基于ADC采样的数字锁相环、无传感器观测器技术及混合方案创新实践。通过对比分析各方案的优劣及适用场景,为电机控制工程师提供实用的技术选型指南,助力提升系统性能与成本效益。

weixin_28691741的博客 845

Spring系列第51篇:导致Spring事务失效常见的几种情况

这算是spring事务第9篇文章了,花了这么多篇文章介绍事务这块的知识,说明事务这块的东西确实比较多、知识点比较细,也非常重要,希望大家能够重视起来,吃透这块的知识。本文2个目的:1、使...

路人甲Java 1369

线性代数知识点整理

线性代数基础知识点摘要整理

cuguanren的博客 3万+

Mysql 事务失效的场景

mysql 事务失效场景

gxb2260的博客 1482

从零构建MAVLink通信:PX4飞控与QGC的协议握手全解析

本文详细解析了PX4飞控与QGC地面站通过MAVLink协议进行通信的全过程,重点介绍了航点传输协议的状态机设计、INT类型消息的优化优势以及异常处理与调试技巧。通过实战案例和性能优化建议,帮助开发者高效构建无人机通信系统,提升数据传输效率与稳定性。

weixin_29209805的博客 505

CVE-2025-25249漏洞深度解析:FortiOS认证绕过与实战缓解

远程代码执行(RCE)是网络安全中最危险的漏洞类型之一,其核心往往源于认证机制失效或内存安全缺陷。CVE-2025-25249正属于此类高危漏洞——它不依赖用户凭证,也不需要交互触发,而是通过超长HTTP头(如X-Forwarded-For)引发内存越界写入,直接绕过FortiOS和FortiSwitchManager的完整认证流程。该漏洞影响广泛、CVSS评分高达9.8,凸显了嵌入式设备在HTTP协议栈实现中的深层风险。在企业网络中,FortiGate等设备常作为边界守门人,一旦失陷将导致root级控制权

weixin_33694620的博客 524

记一次Spring事务失效案例

如题,最近接手一个SSM项目,写了一个功能,功能是这样的,首先接收数据,然后经过七八个类的处理在最后一个类进行存储 流程: 数据 -> A类(处理) ->B类(处理) ->C类(处理) -> .....->F类(存储) 而流程之外是一个循环,ABC...F类都有可能出错,所以对于事务有一定的要求, 在功能实现后,开始着手处理事务问题,首先是直接在每个类上添...

kanyun123的博客 927

仓储控制系统(WCS)设计

WCS系统设计方法

cetclyb的博客 2万+

连接池 Druid (四) - 连接归还

数据库连接池Druid 连接归还 源码分析

weixin_44612246的博客 1112

2025年06月中国电子学会青少年软件编程(图形化)等级考试试卷(三级)答案 + 解析

2025年06月中国电子学会青少年软件编程(图形化)等级考试试卷(三级)答案 + 解析

伶俐角少儿编程 341

【Bug已解决】Anthropic tool_result 找不到对应 tool use id 解决方案

方案适用场景推荐指数每个tool_use必须生成对应tool_result最基础的原则,所有Harness都必须遵守⭐⭐⭐⭐⭐裁剪历史时成对处理实现了上下文裁剪/压缩逻辑的Harness⭐⭐⭐⭐⭐并行工具调用结果数量校验支持多工具并行调用的场景⭐⭐⭐⭐使用官方SDK高层封装不需要特别定制消息组装逻辑⭐⭐⭐⭐请求前主动校验中间件追求生产级健壮性,提前拦截问题⭐⭐⭐⭐⭐这类报错,本质上是。

一键难忘的博客 1万+

MySQL中Spring管理的事务开启后不提交引起的事故

了解到一个事故,在MySQL数据库中,使用Spring管理的事务在开启以后没有在操作结束时提交或回滚,使得原有线程在后续执行数据库操作时可能继续使用原有事务,且不会提交,导致对数据库的修改在Java应用层认为是成功,但在数据库层最终是没有生效的,产生了比较严重的后果

adrninistrat0r的博客 9983

代码复现5——VLMaps

报错“AttributeError: module 'clip' has no attribute 'load'”,运行下述命令解决。运行后接着报错:“ModuleNotFoundError: No module named 'pytorch_lightning'”运行后命令后会弹出一个RGB窗口,可以用键盘上的“W”“A”“D”键控制移动视角的变化,“空格”键开始记录,“q”键停止。并更改相关代码文件,vlmaps/vlmaps/lseg/modules/models/lseg_vit.py。

qq_44100524的博客 603

事务未能正确提交导致Druid报错connection holder is null

事务未提交导致Druid报错connection holder is null

翎野君的博客 2585

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Spring、MyBatis、Druid、MySQL使用事务执行SQL语句分析

使用MySQL数据库时,使用事务与不使用事务相比,出现问题时排查更复杂。不使用事务时,客户端只需要请求MySQL服务一次(只考虑显式执行的SQL语句);使用事务时,客户端至少需要请求MySQL服务四次(开启事务、执行SQL语句、提交/回滚事务、恢复自动提交)。在Java中存在一些用法会导致事务失效,有的问题比较明显可以较快定位,有的问题隐藏较深可能需要较长时间排查。因此需要对MySQL的事务执行原理进行分析,并整理用于排查事务相关问题的快速有效的方法。...

adrninistrat0r的博客 1501

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

spring事务及失效分析

Spring事务通过AOP实现声明式事务管理,核心是@Transactional注解,提供隔离级别和传播行为配置。常见失效场景包括:非public方法、异常被捕获未抛出、抛出非运行时异常未指定rollbackFor、同类内部调用、未配置事务管理器、数据库不支持事务、多线程调用及传播行为配置错误。解决方法包括规范代码、指定回滚异常、拆分方法、配置事务管理器等。

2401_85059682的博客 536

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Spring、MyBatis、Druid、MySQL不使用事务执行SQL语句分析

使用MySQL数据库时,使用事务与不使用事务相比,出现问题时排查更复杂。不使用事务时,客户端只需要请求MySQL服务一次(只考虑显式执行的SQL语句);使用事务时,客户端至少需要请求MySQL服务四次(开启事务、执行SQL语句、提交/回滚事务、恢复自动提交)。在Java中存在一些用法会导致事务失效,有的问题比较明显可以较快定位,有的问题隐藏较深可能需要较长时间排查。因此需要对MySQL的事务执行原理进行分析,并整理用于排查事务相关问题的快速有效的方法。在Java应用中访问MySQL服务时,涉及Java应用、

adrninistrat0r的博客 2025

SpringBoot多数据源切换失效分析与解决方案

在分布式系统中,数据库读写分离是常见的性能优化手段,其核心在于通过动态数据源路由实现请求分流。SpringBoot通过AbstractRoutingDataSource和ThreadLocal机制支持多数据源切换,但在实际开发中常遇到切换失效问题。这主要涉及Spring事务管理机制、AOP执行顺序、线程上下文传递等底层原理。典型场景包括事务方法内切换无效、异步线程标识丢失等。合理使用TransmittableThreadLocal、调整切面顺序、严格管理连接生命周期可有效解决问题。本文结合订单服务等实际案例

weixin_34248023的博客 349

MySQL SQL语句与事务执行及日志分析

在事务的执行过程中,Java应用(MySQL客户端)、MySQL服务、存储引擎,这三者需要共同参与,都需要知道当前是否使用了事务,以及事务的当前状态。自动提交是MySQL的会话参数,默认为是,即MySQL执行SQL语句时,默认会自动提交。MySQL在事务中执行SQL时,包含三个步骤:执行START TRANSACTION或SET autocommit=0等语句,以开启事务;执行需要在事务中执行的SQL语句;执行COMMIT以提交事务;或执行ROLLBACK以回滚事务。...

adrninistrat0r的博客 2749

tcpdump、Wireshark抓包分析MySQL SQL语句与事务执行

使用MySQL数据库时,使用事务与不使用事务相比,出现问题时排查更复杂。不使用事务时,客户端只需要请求MySQL服务一次(只考虑显式执行的SQL语句);使用事务时,客户端至少需要请求MySQL服务四次(开启事务、执行SQL语句、提交/回滚事务、恢复自动提交)。在Java中存在一些用法会导致事务失效,有的问题比较明显可以较快定位,有的问题隐藏较深可能需要较长时间排查。因此需要对MySQL的事务执行原理进行分析,并整理用于排查事务相关问题的快速有效的方法。...

adrninistrat0r的博客 7157

Spring、MyBatis、Druid、MySQL执行SQL语句与事务监控

Druid支持使用自定义Filter,可对SQL语句与事务执行按照需要进行监控。使用Druid自定义Filter监控SQL语句与事务执行的效果,可参考“数据源使用错误导致MySQL事务失效分析”。在Spring XML中,可通过以下方式,在“com.alibaba.druid.pool.DruidDataSource”对应的bean中配置Druid自定义Filter。上类FilterEventAdapter为FilterAdapter的子类。...

adrninistrat0r的博客 1886

TiDB乐观事务、悲观事务模型验证

TiDB与MySQL中的事务处理并不完全相同,以下在TiDB事务中执行select for update与update语句,使用数据库进行锁控制,对TiDB不同条件下事务执行情况进行分析与验证。

adrninistrat0r的博客 2082

Ultralearning重构数据科学学习:以产品需求为驱动的实战方法论

数据科学不是纯理论学科,而是面向业务交付的技术实践。其核心在于理解‘产品需求—数据管道—模型解释—运营动作’的全链路逻辑,而非孤立掌握Python、SQL或机器学习算法。Ultralearning强调高强度认知训练与最小可交付单元(MVDU)设计,将学习过程转化为可验证、可验收、可跨职能协同的产品开发实践。该方法直击转行者‘学完不会用’、新人‘产出不落地’、团队‘学习低效’三大痛点,通过需求冻结、逆向工程、角色扮演与失败复盘等机制,重塑数据人才的工程化思维与业务翻译能力。

hwpokay的专栏 393

事务 失效的八种情况

Transactional注解只能在在public修饰的方法下使用。1. 访问权限限制:非public修饰的方法可能无法被外部调用,而事务通常需要在外部调用的方法中开启。如果方法无法被外部调用,事务就无法生效。2. 事务管理器配置问题:事务管理器可能没有正确配置非public方法的事务传播行为。事务传播行为定义了事务在方法调用链中的传播方式,包括事务的开启、提交和回滚等操作。如果事务管理器没有正确配置非public方法的传播行为,事务可能无法正常生效。

selints的博客 1万+

Mysql--实战篇--@Transactional失效场景及避免策略(@Transactional实现原理,失效场景,内部调用问题等)

在Spring框架中,@Transactional注解用于声明式事务管理,能够简化事务的处理逻辑。然而,在某些情况下,@Transactional可能会失效,导致事务无法按预期工作。了解这些失效场景及其原因,可以帮助你更好地管理和调试事务问题。

weisian的博客 3万+

多数据源情况下事务失效分析

mybatis plus 多数据源事务失效原因及原理分析

u014233972的博客 4323
上一篇: Spring、MyBatis、Druid、MySQL执行SQL语句与事务监控
下一篇: Jackson @JsonProperty重复字段处理
adrninistrat0r
博客等级 码龄18年 395粉丝 136原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值