java.sql.SQLException: txn too large, size: 104857606.

错误详情

java 复制代码
[2024-08-19 02:00:26.214][ERROR][scheduling-1][][o.s.s.s.TaskUtils$LoggingErrorHandler:95]Unexpected error occurred in scheduled task
org.springframework.jdbc.UncategorizedSQLException:
### Error updating database.  Cause: java.sql.SQLException: txn too large, size: 104857632.
### The error may exist in com/pt/ac/rep/biz/mapper/AcMapper.java (best guess)
### The error may involve com.ptc.action.replay.biz.mapper.ActionRecordMapper.deleteByCreateTime-Inline
### The error occurred while setting parameters
### SQL: DELETE FROM user_ac_record WHERE counter <= 0 and create_time <= ?
### Cause: java.sql.SQLException: txn too large, size: 104857632.
; uncategorized SQLException; SQL state [HY000]; error code [1105]; txn too large, size: 104857632.; nested exception is java.sql.SQLExcep
tion: txn too large, size: 104857632.
        at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:8
9)
        at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:8
1)
        at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:8
1)
        at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:88)
        at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:440)
        at com.sun.proxy.$Proxy110.delete(Unknown Source)
        at org.mybatis.spring.SqlSessionTemplate.delete(SqlSessionTemplate.java:303)
        at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:70)
        at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$PlainMethodInvoker.invoke(MybatisMapperProxy.java:148)
        at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89)
        at com.sun.proxy.$Proxy115.deleteByCreateTime(Unknown Source)
        at com.ptc.ac.rep.biz.service.ClearRecordService.clearOldUserData(ClearRecordService.java:37)
        at com.ptc.ac.rep.biz.task.QuicBizAwareTask.clearOldData(QuicBizAwareTask.java:29)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:566)
        at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:84)
        at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54)

通用原因

bash 复制代码
由于底层存储引擎的限制,TiDB 要求单行不超过 6 MB。可以将一行的所有列根据类型转换为字节数并加和来估算单行大小。

TiDB 同时支持乐观事务与悲观事务,其中乐观事务是悲观事务的基础。由于乐观事务是先将修改缓存在私有内存中,因此,TiDB 对于单个事务的容量做了限制。

TiDB 中,单个事务的总大小默认不超过 100 MB,这个默认值可以通过配置文件中的配置项 txn-total-size-limit 进行修改,最大支持 10 GB。单个事务的实际大小限制还取决于服务器剩余可用内存的大小,执行事务时 TiDB 进程的内存消耗相对于事务大小会存在一定程度的放大,最大可能达到提交事务大小的 6 倍以上。

在 4.0 以前的版本,TiDB 限制了单个事务的键值对的总数量不超过 30 万条,从 4.0 版本起 TiDB 取消了这项限制。

当前原因

在tidb中尝试一次性删除了太多数据,超过了单个事务的总大小限制。

解决方案

减少每次删除的条数,从而降低tx的总的大小。

相关推荐
侠客行03171 天前
Mybatis连接池实现及池化模式
java·mybatis·源码阅读
蛇皮划水怪1 天前
深入浅出LangChain4J
java·langchain·llm
灰子学技术1 天前
go response.Body.close()导致连接异常处理
开发语言·后端·golang
老毛肚1 天前
MyBatis体系结构与工作原理 上篇
java·mybatis
风流倜傥唐伯虎1 天前
Spring Boot Jar包生产级启停脚本
java·运维·spring boot
二十雨辰1 天前
[python]-AI大模型
开发语言·人工智能·python
Yvonne爱编码1 天前
JAVA数据结构 DAY6-栈和队列
java·开发语言·数据结构·python
Re.不晚1 天前
JAVA进阶之路——无奖问答挑战1
java·开发语言
你这个代码我看不懂1 天前
@ConditionalOnProperty不直接使用松绑定规则
java·开发语言
pas1361 天前
41-parse的实现原理&有限状态机
开发语言·前端·javascript