Spring事务管理,声明式事务和编程式事务实现

数据库操作过程中,对于增删改等操作,因为涉及到数据库状态的变更,为保证数据安全,需要进行事务管理;Spring事务管理有两种方式,即声明式事务管理和编程式事务管理;

连接池配置:

jdbc configuration
jdbc.url=jdbc\:mysql\://127.0.0.1\:3306/ssm?useUnicode\=true&characterEncoding\=utf8&characterSetResults\=utf8
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.username=root
jdbc.password=123456

以下为 优化配置
jdbc.filters=stat

jdbc.maxActive=20
jdbc.initialSize=1
jdbc.maxWait=60000
jdbc.minIdle=10
jdbc.maxIdle=15

jdbc.timeBetweenEvictionRunsMillis=60000
jdbc.minEvictableIdleTimeMillis=300000

jdbc.validationQuery=SELECT 'x'
jdbc.testWhileIdle=true
jdbc.testOnBorrow=false
jdbc.testOnReturn=false

jdbc.maxOpenPreparedStatements=20
jdbc.removeAbandoned=true
jdbc.removeAbandonedTimeout=1800
jdbc.logAbandoned=true


代码演示:

package com.dongzz.ssm.modules.system.service;

import com.dongzz.ssm.SpringBaseJunit;
import com.dongzz.ssm.modules.system.entity.SysUser;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.DefaultTransactionDefinition;

import javax.sql.DataSource;

/**
 * 编程式事务管理
 */
public class UserServiceTest extends SpringBaseJunit {

    @Autowired
    PlatformTransactionManager transactionManager;
    @Autowired
    DataSource dataSource;

    JdbcTemplate jdbcTemplate;

    @Test
    public void transactionTest() {
        String sql1 = "update book set name = '算法导论(原书篇3版)' where id = 1";
        String sql2 = "update book set name = 'Java编程思想(篇4版)' where id = 2";
        // 设置事务隔离级别 传播特性
        DefaultTransactionDefinition dtd = new DefaultTransactionDefinition();
        dtd.setIsolationLevel(TransactionDefinition.ISOLATION_READ_COMMITTED);
        dtd.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
        // 获取事务状态,spring根据传播行为来开启事务
        TransactionStatus status = transactionManager.getTransaction(dtd);
        jdbcTemplate = new JdbcTemplate(dataSource);
        try {
            jdbcTemplate.update(sql1);
            jdbcTemplate.update(sql2);
            transactionManager.commit(status); // 提交事务
        } catch (Exception e) {
            e.printStackTrace();
            transactionManager.rollback(status); // 回滚事务
        }
    }
}

借助 spring 的 TransactionTemplate 工具类简化事务管理编码;

@Test
public void transactionTemplateTest() {
    String sql1 = "update book set name = '算法导论(原书篇3版)' where id = 1";
    String sql2 = "update book set name = 'Java编程思想(篇4版)' where id = 2";

    jdbcTemplate = new JdbcTemplate(dataSource);
    TransactionTemplate template = new TransactionTemplate(transactionManager);
    template.setIsolationLevel(TransactionDefinition.ISOLATION_READ_COMMITTED);
    template.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
    template.execute(new TransactionCallbackWithoutResult() {

        @Override
        protected void doInTransactionWithoutResult(TransactionStatus transactionStatus) {
            jdbcTemplate.update(sql1);
            jdbcTemplate.update(sql2);
        }
    });
}

spring xml 添加如下配置:


使用演示:

在需要开启事务管理的类或方法上添加 @Transactional 注解即可;

package com.dongzz.ssm.modules.system.service.impl;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;

import cn.hutool.core.util.StrUtil;
import com.dongzz.ssm.common.base.impl.BaseMybatisServiceImpl;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.dongzz.ssm.common.plugin.datatables.PageTableHandler;
import com.dongzz.ssm.common.plugin.datatables.PageTableHandler.CountHandler;
import com.dongzz.ssm.common.plugin.datatables.PageTableHandler.ListHandler;
import com.dongzz.ssm.common.plugin.datatables.PageTableHandler.OrderHandler;
import com.dongzz.ssm.common.exception.ServiceException;
import com.dongzz.ssm.common.plugin.datatables.PageTableRequest;
import com.dongzz.ssm.common.plugin.datatables.PageTableResponse;
import com.dongzz.ssm.modules.system.dao.SysUserMapper;
import com.dongzz.ssm.modules.system.entity.SysUser;
import com.dongzz.ssm.modules.system.service.UserService;
import org.springframework.transaction.annotation.Transactional;

@Service
public class UserServiceImpl extends BaseMybatisServiceImpl implements UserService {

    @Autowired
    private SysUserMapper userMapper;

    @Override
    @Transactional
    public void addUser(SysUser user) throws Exception {
        SysUser u = userMapper.selectUserByUname(user.getUsername());
        if (null != u) {
            throw new ServiceException("用户名已存在");
        }
        user.setCreateTime(new Date());
        user.setUpdateTime(new Date());
        user.setStatus("1");
        user.setIsDel("0");
        userMapper.insertSelective(user);
    }
}

spring xml 添加如下配置:


上述配置将 txAdvice 切面中的通知方法动态的切入到名称为 pc 的切入点表达式对应的位置,所有通配符匹配的方法均纳入事务管理;

Original: https://www.cnblogs.com/herokevin/p/15837679.html
Author: 暴走编程
Title: Spring事务管理,声明式事务和编程式事务实现

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/621664/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Linux 时间操作及其同步

    本文将以 Arch Linux 为例,讨论 Linux 的时间操作和同步方法。 操作系统的时间 (clock) 由三或四部分决定: 时间值; 是否为 UTC 时间; 时区; (如果…

    Linux 2023年5月27日
    090
  • OpenStack cinder对接NFS后端存储

    配置NFS服务 安装NFS服务 查询是否安装 [root@nfs ~]# rpm -qa |grep nfs nfs-utils-1.3.0-0.8.el7.x86_64 如没有安…

    Linux 2023年6月8日
    0127
  • jenkins集成gitlab 授权登录

    配置方法:1.gitlab 新建个人application 如上图, Name, 名称随便填 Redirect URI: http://xxxxxx/securityRealm/f…

    Linux 2023年6月14日
    0153
  • zabbix用法

    zabbix用法 zabbix web管理界面功能介绍 默认页面是个仪表盘,右上角的编辑可以自定义布局 Monitoring(监控) Dashboard(仪表盘) 和主页面一样,可…

    Linux 2023年6月13日
    074
  • Linux 0.11源码阅读笔记-总览

    Linux 0.11源码阅读笔记-总览 阅读源码的目的 加深对Linux操作系统的了解,了解Linux操作系统基本架构,熟悉进程管理、内存管理等主要模块知识。 通过阅读教复杂的代码…

    Linux 2023年5月27日
    097
  • 聊聊Mysql主从同步读写分离配置实现

    Hi,各位热爱技术的小伙伴您们好,好久没有写点东西了,今天写点关于mysql主从同步配置的操作日志同大家一起分享。最近自己在全新搭建一个mysql主从同步读写分离数据库简单集群,我…

    Linux 2023年6月14日
    086
  • Linux通过手机USB网络共享上网

    多数情况下,服务器无法直接联网,需通过手机连线上网。设置方法如下: 终端中查看现有网络接口: ip addr 或 ifconfig 连接好数据线并在手机设置中打开”通过…

    Linux 2023年6月14日
    085
  • phpcms全文检索功能实现(集成sphinx)

    sphinx配置 sphinx是俄罗斯人开发的一个搜索引擎,基于c++编写,具有强大的检索能力,本身支持中文单个字符的检索,中文分词需要额外的插件Coreseek,但该插件已很久未…

    Linux 2023年6月13日
    0111
  • k4t系统架构 & 部署最佳实践

    《kaiiit船长》 容器自动管理软件 (k4t,国产k8s) k4t系统架构 & 部署最佳实践 文档修订时间: 2021-11-20 关键词 : k4t kaiiit 船…

    Linux 2023年6月13日
    090
  • Windows server 2012 安装exchange 2013

    一、实验环境 操作系统:Windows server 2012 R2 邮件系统版本:exchange 2013 安装的服务:AD CS、AD DS、IIS、DNS 二、安装exch…

    Linux 2023年6月7日
    0105
  • 高通MSM8998 ABL的调试

    高通在MSM8998上引入了UEFI,用来代替LK(Little Kernel)。高通UEFI由XBL和ABL两部分组成。XBL负责芯片驱动及充电等核心应用功能。ABL包括芯片无关…

    Linux 2023年6月7日
    073
  • 电脑中图标变白色教你怎么修复

    复制一下代码到文本文档中 另存为 .bat 然后点击好的配置文件右键以管理员身份运行 就会解决桌面变白的问题 @echo off taskkill /f /im explorer….

    Linux 2023年6月7日
    085
  • Docker搭建Redis Cluster集群及扩容和收容

    上一篇文章讲解了Redis集群原理及搭建,由于工作中使用docker较多,本文主要讲解使用docker搭建集群及对集群的扩展收容。环境:Centos7.6Docker:20.10….

    Linux 2023年6月13日
    069
  • Makefile

    target … : prerequisites … command … … target可以是一个object file(目标文件),也可以是一个执行文件,还可以…

    Linux 2023年6月7日
    086
  • [随记]-linux侦听端口的4种方法

    侦听 192.168.0.1 服务器上的 10086 端口是否打开 1. telnet telnet是windows 内置的功能,当然 linux 也有。用法: tenlet 19…

    Linux 2023年6月6日
    098
  • gnutls_handshake() failed

    原文链接:https://www.zhoubotong.site/post/75.html使用git clone https://github.com/xxx.git的时候,出现错…

    Linux 2023年6月6日
    085
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球