Spring之事务管理TranscationManager(大合集)

news2024/11/15 23:32:00
  1. 原子性

事务是数据库的逻辑工作单位,事务中包括的诸操作要么全做,要么全不做。

  1. 一致性

事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。

  1. 隔离性

一个事务的执行不能被其他事务干扰。

  1. 持续性

一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。

在正常的web项目中,事务和DAO一直如影随行,所以有人认为配置事务和DAO的关系是密不可分,不能分离的。其实不然,DAO可以完全脱离容器独立存在。

applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns=“http://www.springframework.org/schema/beans”

xmlns:p=“http://www.springframework.org/schema/p” xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”

xmlns:context=“http://www.springframework.org/schema/context” xmlns:aop=“http://www.springframework.org/schema/aop”

xmlns:mvc=“http://www.springframework.org/schema/mvc”

xmlns:tx=“http://www.springframework.org/schema/tx”

xmlns:ehcache=“http://ehcache-spring-annotations.googlecode.com/svn/schema/ehcache-spring”

xsi:schemaLocation="

http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans-3.2.xsd

http://www.springframework.org/schema/context

http://www.springframework.org/schema/context/spring-context-3.2.xsd

http://www.springframework.org/schema/mvc

http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd

http://www.springframework.org/schema/tx

http://www.springframework.org/schema/tx/spring-tx-3.2.xsd

http://www.springframework.org/schema/aop

http://www.springframework.org/schema/aop/spring-aop-3.2.xsd

http://ehcache-spring-annotations.googlecode.com/svn/schema/ehcache-spring

http://ehcache-spring-annotations.googlecode.com/svn/schema/ehcache-spring/ehcache-spring-1.1.xsd">

<mvc:annotation-driven />

<context:component-scan base-package=“com.zhu” />

<bean id=“dataSource” class=“com.alibaba.druid.pool.DruidDataSource”

destroy-method=“close”

p:driverClassName=“com.mysql.jdbc.Driver”

p:username=“zhu”

p:password=“zhu” />

<bean id=“jdbcTemplate” class=“org.springframework.jdbc.core.JdbcTemplate”

p:dataSource-ref=“dataSource” />

zhu_test.sql

CREATE TABLE IF NOT EXISTS zhu_test (NAME VARCHAR(20),age INT(100)) ENGINE = INNODB;

测试类:

package com.zhu.service;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import org.springframework.jdbc.core.JdbcTemplate;

import org.springframework.stereotype.Service;

import com.alibaba.druid.pool.DruidDataSource;

@Service(“service1”)

public class UserJdbcWithoutTransManagerService {

@Autowired

private JdbcTemplate jdbcTemplate;

public void addScore(String userName,int toAdd){

String sql = “UPDATE zhu_test u SET u.age = u.age + ? WHERE name =?”;

jdbcTemplate.update(sql,toAdd,userName);

}

public static void main(String[] args) {

ApplicationContext ctx =

new ClassPathXmlApplicationContext(“file:src/main/resources/applicationContext.xml”);

UserJdbcWithoutTransManagerService service =

(UserJdbcWithoutTransManagerService)ctx.getBean(“service1”);

JdbcTemplate jdbcTemplate = (JdbcTemplate)ctx.getBean(“jdbcTemplate”);

DruidDataSource druidDataSource = (DruidDataSource)jdbcTemplate.getDataSource();

//①.检查数据源autoCommit的设置

System.out.println(“autoCommit:”+ druidDataSource.isDefaultAutoCommit());

//②.插入一条记录,初始分数为10

jdbcTemplate.execute(

“INSERT INTO zhu_test VALUES(‘tom’,10)”);

//③.调用工作在无事务环境下的服务类方法,将分数添加20分

service.addScore(“tom”,20);

//④.查看此时用户的分数

@SuppressWarnings(“deprecation”)

int score = jdbcTemplate.queryForInt(“SELECT age FROM zhu_test WHERE name =‘tom’”);

System.out.println(“score:”+score);

jdbcTemplate.execute(“DELETE FROM zhu_test WHERE name=‘tom’”);

}

}

运行结果:

这里写图片描述

applicationContext.xml中并没有配置事务,但是还是持久化到数据库中去了。DataSource默认设置是自动提交的,也就是说,在执行了CRUD之后,会马上持久化到数据库中。如果设置自动提交为false,那么在jdbcTemplate执行完之后并不会马上持久化到数据库中,除非手动提交。

虽说没有事务管理,程序依然可以进行数据的CRUD操作,但是没有事务管理,在数据安全同步方面会面临很大的挑战。栗子太多,不一一举例,看代码

我们故意提交一条错误的sql语句

package com.zhu.service;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import org.springframework.jdbc.core.JdbcTemplate;

import org.springframework.stereotype.Service;

import com.alibaba.druid.pool.DruidDataSource;

@Service(“service1”)

public class UserJdbcWithoutTransManagerService {

@Autowired

private JdbcTemplate jdbcTemplate;

public void addScore(String userName,int toAdd){

String sql = “UPDATE zhu_test u SET u.age = u.age + ? WHERE name =?”;

jdbcTemplate.update(sql,toAdd,userName);

}

public static void main(String[] args) {

ApplicationContext ctx =

new ClassPathXmlApplicationContext(“file:src/main/resources/applicationContext.xml”);

UserJdbcWithoutTransManagerService service =

(UserJdbcWithoutTransManagerService)ctx.getBean(“service1”);

JdbcTemplate jdbcTemplate = (JdbcTemplate)ctx.getBean(“jdbcTemplate”);

DruidDataSource druidDataSource = (DruidDataSource)jdbcTemplate.getDataSource();

//①.检查数据源autoCommit的设置

System.err.println(“autoCommit:”+ druidDataSource.isDefaultAutoCommit());

//②.插入一条记录,初始分数为10

jdbcTemplate.execute(

“INSERT INTO zhu_test VALUES(‘tom’,10)”);

//③.执行一条错误sql语句

jdbcTemplate.execute(

“INSERT INTO zhu_test VALUES(‘tom1’,10,00)”);

//④.调用工作在无事务环境下的服务类方法,将分数添加20分(不会执行)

service.addScore(“tom”,20);

}

}

清空数据,然后执行结果是:②成功插入数据tom 10 然后③错误的sql抛出异常 然后④更新操作也不会执行。

正常的逻辑是在同一方法或者类中执行一系列的CRUD操作,其中一条出出现问题会抛出异常,然后已经执行完的语句回滚到发生异常之前的状态。

这种情况在正常的开发环境是最基本的常识性错误,开发过程中一定要避免。

然后是配置事务。

applicationContext.xml文件中添加事务和模型视图的配置

package com.zhu.controller;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.jdbc.core.JdbcTemplate;

import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.ResponseBody;

@Controller

public class NoTMController {

//②.自动注入JdbcTemplate

@Autowired

private JdbcTemplate jdbcTemplate;

//③.通过Spring MVC注解映URL请求

@RequestMapping(“/logon”)

@ResponseBody

public String logon(String userName,String password){

String sql = “UPDATE zhu_test u SET u.age = u.age + ? WHERE name =?”;

if(isRightUser(userName,password)){

//执行更新操作(年龄加20)

jdbcTemplate.update(sql,20,“tom”);

//执行错误语句

jdbcTemplate.execute(

“INSERT INTO zhu_test VALUES(‘tom1’,10,00)”);

return “success”;

}else{

return “fail”;

}

}

private boolean isRightUser(String userName,String password){

//do sth…

return true;

}

}

总结

至此,文章终于到了尾声。总结一下,我们谈论了简历制作过程中需要注意的以下三个部分,并分别给出了一些建议:

  1. 技术能力:先写岗位所需能力,再写加分能力,不要写无关能力;
  2. 项目经历:只写明星项目,描述遵循 STAR 法则;
  3. 简历印象:简历遵循三大原则:清晰,简短,必要,要有的放矢,不要海投;

以及最后为大家准备的福利时间:简历模板+Java面试题+热门技术系列教程视频

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

(String userName,String password){

//do sth…

return true;

}

}

总结

至此,文章终于到了尾声。总结一下,我们谈论了简历制作过程中需要注意的以下三个部分,并分别给出了一些建议:

  1. 技术能力:先写岗位所需能力,再写加分能力,不要写无关能力;
  2. 项目经历:只写明星项目,描述遵循 STAR 法则;
  3. 简历印象:简历遵循三大原则:清晰,简短,必要,要有的放矢,不要海投;

以及最后为大家准备的福利时间:简历模板+Java面试题+热门技术系列教程视频

[外链图片转存中…(img-StHghd0I-1721068307617)]

[外链图片转存中…(img-9peGmD04-1721068307618)]

[外链图片转存中…(img-9oHbukwb-1721068307619)]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1928569.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

人工智能算法工程师(中级)课程12-PyTorch神经网络之LSTM和GRU网络与代码详解1

大家好,我是微学AI,今天给大家介绍一下人工智能算法工程师(中级)课程12-PyTorch神经网络之LSTM和GRU网络与代码详解。在深度学习领域,循环神经网络(RNN)因其处理序列数据的能力而备受关注。然而,传统的RNN存在梯度消失和梯度爆炸的问题,这使得它在长序列任务中的表现不尽…

【Git分支管理】理解分支 | 创建分支 | 切换分支 | 合并分支 | 删除分支 | 强制删除分支

目录 前言 0.理解分支 1.查看本地仓库存在的分支 2.HEAD指向分支 3.创建本地分支 4.切换分支 5.分支提交操作 6.合并分支 快进模式Fast-forward 7.删除分支 8.强制删除分支 本篇开始介绍下Git提供的杀手级的功能&#xff1a;分支管理 先提交再合并 前言 在玄幻武侠…

IP-Guard日志数据上传至 SYSLOG 服务器操作指南

一、功能简介 服务器支持把日志数据上传到 SYSLOG 服务器。 二、功能配置 2.1 数据目录移交设置 在服务器安装目录下 OServer3.ini 文件中&#xff0c;添加工具启动配置&#xff0c;配置五分钟内生效。 Path&#xff1a;设置移交目录路径&#xff0c;IPG 服务器会把收集完成的…

Redis④ —— 高可用

1. 主从复制 一主多从模式&#xff0c;采用读写分离的方式主服务器可以进行读写操作&#xff0c;当发生写操作时自动将写操作同步给从服务器&#xff0c;而从服务器一般是只读&#xff0c;并接受主服务器同步过来写操作命令&#xff0c;然后执行这条命令。主从服务器之间的命令…

jvm常用密令、jvm性能优化、jvm性能检测、Java jstat密令使用、Java自带工具、Java jmap使用

1.jps是Java虚拟机的进程状态工具&#xff0c;用于列出正在运行的Java进程 jps命令的使用&#xff1a;cmd打开直接jps 1.1不带参数&#xff1a; jps 默认情况下&#xff0c;列出所有正在运行的 Java 进程的进程 ID 和主类名。 1.2 -l&#xff1a;显示完整的主类名或 JAR 文件…

《故障复盘 · 数据库连接异常关闭》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; CSDN入驻不久&#xff0c;希望大家多多支持&#xff0c;后续会继续提升文章质量&#xff0c;绝不滥竽充数…

不开放80或443端口也能申请IP SSL证书!

在申请SSL/HTTPS证书时&#xff0c;如果不方便使用域名或者没有域名&#xff0c;就要申请一种特殊的SSL证书——IP SSL证书。但是一般的IP地址证书签发过程中&#xff0c;需要短暂开放80或者443端口才能签发成功。那么问题来了&#xff0c;有的实在不能开放80或者443端口&#…

keil中GD32 MCU IAP中APP的存储地址如何设置?

前面和大家聊过什么是IAP&#xff0c;那么IAP中APP的存储地址该如何设置呢&#xff1f; 以keil为例&#xff0c;打开工程的option选项卡&#xff1a; 将IROM1中的地址改为你想要保存的位置&#xff0c;比如0x08008000开始的位置&#xff1a; 这样通过keil烧录&#xff0c;程序…

记录|.NET上位机开发和PLC通信的实现

本文记录源自&#xff1a;B站视频 实验结果&#xff1a;跟视频做下来是没有问题的。能运行。 目录 前言一、项目Step1. 创建项目Step2. 创建动态图片展示Step3. 创建图片型按钮Step4. 创建下拉框Step1~4的效果展示Step5. 编程实体类操作类Main函数 Step1~5的效果展示Main函数 最…

[Python学习篇] Python PyMysql

什么是PyMysql PyMysql是一个纯 Python 实现的 MySQL 客户端库&#xff0c;允许你在 Python 程序中与 MySQL 数据库进行交互。 安装PyMysql PyMysql地址&#xff1a;https://pypi.org/project/PyMySQL/ pip install pymysql 使用PyMysql 连接mysql import pymysql# 数据库连…

数据库redis命令作业九

1、安装redis&#xff0c;启动客户端、验证。 2、string类型数据的命令操作&#xff1a; &#xff08;1&#xff09; 设置键值&#xff1a; &#xff08;2&#xff09; 读取键值&#xff1a; &#xff08;3&#xff09; 数值类型自增1&#xff1a; &#xff08;4&#xff09; 数…

【单片机毕业设计选题24064】-基于阿里云的鱼塘水质检测系统

系统功能: 主控为STM32F103C8T6&#xff0c;通过PH值传感器、浑浊度传感器、温度传感器采集各项水质数据&#xff0c;系统可设定各参数 的阈值&#xff0c;超过设定的阈值将通过蜂鸣器响来提醒用户做出措施&#xff0c;同时通过ESP-12F WIFI模块将设备连接阿里云 物联网平台…

信通院全景图发布 比瓴科技领跑软件供应链安全,多领域覆盖数字安全服务

近日&#xff0c;中国信息通信研究院在2024全球数字经济大会—数字安全生态建设专题论坛正式发布首期《数字安全护航技术能力全景图》&#xff08;以下简称全景图&#xff09;。 比瓴科技入选软件供应链安全赛道“开发流程安全管控、交互式安全测试、静态安全测试、软件成分分…

rtf是什么格式的文件?rtf格式和word的区别是什么?

RTF是什么格式的文件? RTF&#xff08;富文本格式&#xff0c;Rich Text Format&#xff09;和Word文档&#xff08;以.doc和.docx为扩展名的Microsoft Word文档&#xff09;是两种常用的文本文件格式。它们在文件结构、兼容性、功能和使用场景等方面存在一些显著差异。 比如…

泰迪智能科技江西大数据实验室成功案例介绍说明

高校大数据实验室作为作为支撑高校人培方案实施的核心设施&#xff0c;实验室的建设一定要与学科建设、人才培养充分融合&#xff0c;是一个包含物理空间硬件资源软件资源课程内容的系统化工程。高校在实验室规划过程中&#xff0c;第一要务就是从学科定位出发、结合学校的特色…

ASP.NET MVC-制作可排序的表格组件-PagedList版

环境&#xff1a; win10 参考&#xff1a; 学习ASP.NET MVC(十一)——分页 - DotNet菜园 - 博客园 https://www.cnblogs.com/chillsrc/p/6554697.html ASP.NET MVCEF框架实现分页_ef 异步分页-CSDN博客 https://blog.csdn.net/qq_40052237/article/details/106599528 本文略去…

分布式IO系统BL201 Profinet耦合器

BL201耦合器是一个数据采集和控制系统&#xff0c;基于强大的32 位微处理器设计&#xff0c;采用Linux操作系统&#xff0c;是一种模块化的分布式I/O系统。该系统由3部分组成&#xff1a;现场总线耦合器和各种类型的&#xff08;数字和模拟信号以及特殊功能&#xff09;I/O模块…

部署k8s 1.28.9版本

继上篇通过vagrant与virtualBox实现虚拟机的安装。笔者已经将原有的vmware版本的虚拟机卸载掉了。这个场景下&#xff0c;需要重新安装k8s 相关组件。由于之前写的一篇文章本身也没有截图。只有命令。所以趁着现在。写一篇&#xff0c;完整版带截图的步骤。现在行业这么卷。离…

C#与倍福Plc通信——使用仿真软件模拟倍福PLC运行

前言 我们在编写上位机与倍福PLC通信的过程中,有时候我们没有真实的Plc,但是我们又想提前测试与倍福PLC的通信,那么这个时候我们就可以使用倍福的仿真软件模拟PLC,然后我们上位机就可以与仿真PLC进行通信了,下面进行详细介绍: 1、下载并安装倍福PLC编程软件TwinCAT 安…

Uniapp自定义动态加载组件(2024.7更新)

1.本次介绍如何使用uniapp实现自定义动态加载Loading的组件&#xff0c;可以gif格式&#xff0c;也可以mp4格式等; 编写自定义Loading组件(CustomLoader.vue)&#xff1b;组件中含有“动态接收图片路径”&#xff0c;“10秒超时未false则自动断开关闭Loading”&#xff1b;在全…