首页 > 其他分享 >事务超时异常:org.springframework.transaction.TransactionTimedOutException: Transaction timed out: deadline

事务超时异常:org.springframework.transaction.TransactionTimedOutException: Transaction timed out: deadline

时间:2023-06-25 17:56:15浏览次数:51  
标签:25 transaction CST springframework public org import annotation

报错如下:

代码如下:

Controller

import com.zwh.service.impl.TimeOutService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/api/timeout")
@Slf4j
public class DemoController {
    @Autowired
    private TimeOutService timeOutService;

    @GetMapping("/jdbc")
    public void queryPage() {
        timeOutService.testAnnotationTransactionalTimeOutWithJdbcTemplate();
    }
}

service

import com.zwh.dao.StudentDaoWithJdbcTemplate;
import lombok.SneakyThrows;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.support.TransactionCallbackWithoutResult;
import org.springframework.transaction.support.TransactionTemplate;

import javax.annotation.Resource;

@Service
public class TimeOutService {
    @Resource
    private StudentDaoWithJdbcTemplate studentDaoWithJdbcTemplate;
    @Autowired
    private TransactionTemplate transactionTemplate;
    @Transactional(value = "transactionManager", timeout = 2)
    public void testAnnotationTransactionalTimeOutWithJdbcTemplate() {
        try {
            Thread.sleep(3000);
        } catch (Exception e) {

        }
        studentDaoWithJdbcTemplate.update();
    }
}

jdbcTemplate

import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.StatementCallback;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.sql.SQLException;
import java.sql.Statement;
@Component
public class StudentDaoWithJdbcTemplate {
    @Resource
    private JdbcTemplate jdbcTemplate;

    public void update() {

        jdbcTemplate.execute(new StatementCallback<Integer>() {
            public Integer doInStatement(Statement stmt) throws SQLException, DataAccessException {
                stmt.execute("update test set name='zhangsan3' where id = 2;");
                return 1;
            }

        });

    }
}

数据库表test如下:

使用postman访问:http://localhost:8090/api/timeout/jdbc

原因分析:

我们平时在使用spring框架开发项目时,喜欢用@Transactional注解声明事务。如上面的:

@Transactional(value = "transactionManager", timeout = 2)

只需在需要使用事务的方法上,使用@Transactional注解声明一下,该方法通过AOP就自动拥有了事务的功能。

没错,这种做法给我们带来了极大的便利,开发效率更高了。

但也给我们带来了很多隐患,比如大事务的问题。我们一起看看下面的这段代码:

复制代码
@Transactional(rollbackFor = Throwable.class)
public void updateUser(User user) {
    User oldUser = userMapper.getUserById(user.getId());
    if(null != oldUser) {
       userMapper.update(user);
    } else {
       userMapper.insert(user);
    }
    sendMq(user);
}
复制代码

这段代码中getUserById方法和sendMq方法,在这个案例中无需使用事务,只有update或insert方法才需要事务。

所以上面这段代码的事务太大了,是整个方法级别的事务。假如sendMq方法是一个非常耗时的操作,则可能会导致整个updateUser方法的事务超时,从而出现大事务问题。

timeout:用于指定事务的超时时间,默认值是-1,表示永不超时。如果指定了数值,以秒为单位

那么,如何解决这个问题呢?

答:可以使用TransactionTemplate的编程式事务优化代码。

import com.zwh.dao.StudentDaoWithJdbcTemplate;
import lombok.SneakyThrows;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.support.TransactionCallbackWithoutResult;
import org.springframework.transaction.support.TransactionTemplate;

import javax.annotation.Resource;

@Service
public class TimeOutService {
    @Resource
    private StudentDaoWithJdbcTemplate studentDaoWithJdbcTemplate;
    @Autowired
    private TransactionTemplate transactionTemplate;
public void testAnnotationTransactionalTimeOutWithJdbcTemplate() { try { Thread.sleep(3000); } catch (Exception e) { } transactionTemplate.execute(new TransactionCallbackWithoutResult() { @SneakyThrows protected void doInTransactionWithoutResult(TransactionStatus status) { try { studentDaoWithJdbcTemplate.update(); } catch (Exception e) { status.setRollbackOnly(); throw e; } } }); } }

注意:这里没有了@Transactional(value = "transactionManager", timeout = 2)注解

 

标签:25,transaction,CST,springframework,public,org,import,annotation
From: https://www.cnblogs.com/zwh0910/p/17503573.html

相关文章

  • 其他——25封装表单验证
    前言:在我们做vue项目,日常开发的时候,肯定会经常遇到正则表达式,例如手机号,邮箱,密码和数字,每次验证都需要去查询,浪费时间不说,也造成代码冗余,我也遇到过,那我就自己封装一个吧,方便大家使用查询。1.封装一个公共的js文件,命名rule.js://手机号验证telphone:(rule,value,callback......
  • 2023.6.25 圆和矩形是否有重叠
    原问题可以转换为,判断圆心到矩形的最短距离是否小于等于半径。根据这张图,可以得到矩形到圆心的距离是\(\sqrt{x^2+y^2}\),其中x和y分别是圆心和矩形的横纵坐标之差。求横纵坐标之差其实也很简单,以横坐标为例,圆心的坐标为x,矩形的坐标是x1和x2。那么就是\(min(|x-x_1|,|x-......
  • AIX中使用DBCA创建数据库ora-12547错误解决一例
                             AIX中使用DBCA创建数据库ora-12547错误解决一例 Couldnotloadprogramoracledevmdm:Symbolresolutionfailedfor/usr/lib/libc.a[aio_64.o]because:Symbolkaio_rdwr64(number1)isnotexportedfrom......
  • 6.25数据类型
    数字类型整数int浮点数float  如:13.14-13.14复数complex  如:4+3j以j结尾表示复数布尔bool  表达现实生活中的逻辑,即真和假,True表示真,False表示假。True本质上是一个数字记作1,False记作0字符串String 描述文本的一种数字类型,是由任意数量的字符如中文、英文、各......
  • ZigBee SOC芯片CC2530F256RHAR 芯片介绍以及原理图
    ZigBee新一代SOC芯片CC2530F256RHAR是真正的片上系统解决方案,支持IEEE802.15.4标准/ZigBee/ZigBeeRF4CE和能源的应用。拥有庞大的快闪记忆体多达256个字节,CC2530是理想ZigBee专业应用。支持新RemoTI的ZigBeeRF4CE,这是业界首款符合ZigBeeRF4CE兼容的协议栈,和更大内存大小将允许芯片......
  • MSDTC(Microsoft Distributed Transaction Coordinator)是微软的分布式事务协调器,它是Wi
    MSDTC(MicrosoftDistributedTransactionCoordinator)是微软的分布式事务协调器,它是Windows操作系统中的一个组件。MSDTC提供了跨多个资源管理器(如数据库、消息队列等)执行事务的能力,确保事务的原子性、一致性、隔离性和持久性。MSDTC的主要功能如下:事务管理:MSDTC允许在跨多个......
  • C/C++C/C++语言课程设计参考题目[2023-06-25]
    C/C++C/C++语言课程设计参考题目[2023-06-25]《高级程序设计技术综合课程设计》C/C++语言课程设计参考题目目录信息管理类 1工资管理系统 1职工工资信息管理系统 2职工工资管理系统 2院职工工资管理系统 3公司职工工资管理系统 3工资纳税计算系统 3校际运动会管理系统......
  • 云服务器使用记录-20230625
    三丰云提供稳定可靠的云服务器,搭载宝塔面板,支持多种语言环境(包括PHP等),让您轻松地管理网站和数据。无论您是个人博客、企业官网还是电商平台,都可以快速部署并安全运行。这样,您就可以专注于业务发展,享受高效稳定的云服务体验。我推荐您使用Linux版本的系统,因为它占用的资源较少。......
  • 2023/6/25
    19.3.2,19.3.3(4)......
  • 【雕爷学编程】Arduino动手做(125)---WT588D语音模块
    37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来—小小的进步或是搞......