广告
返回顶部
首页 > 资讯 > 数据库 >Spring学习笔记事务(一)
  • 576
分享到

Spring学习笔记事务(一)

2024-04-02 19:04:59 576人浏览 泡泡鱼
摘要

鲁春利的工作笔记,好记性不如烂笔头事务是一系列操作组成的工作单元,是不可分割的,即要么所有操作都做,要么所有操作都不做,这就是事务。事务必需满足ACID(原子性、一致性、隔离性和持久性)特性,缺一不可:&n

鲁春利的工作笔记,好记性不如烂笔头



事务是一系列操作组成的工作单元,是不可分割的,即要么所有操作都做,要么所有操作都不做,这就是事务。
事务必需满足ACID(原子性、一致性、隔离性和持久性)特性,缺一不可:
    原子性(Atomicity):即事务是不可分割的最小工作单元,事务内的操作要么全做,要么全不做;
    一致性(Consistency):在事务执行前数据库的数据处于正确的状态,而事务执行完成后数据库的数据还是处于正确的状态;
    隔离性(Isolation):并发事务执行之间无影响,在一个事务内部的操作对其他事务不会产生影响;
    持久性(Durability):事务一旦执行成功,它对数据库的数据的改变必须是永久的。

在实际项目开发中数据库操作一般都是并发执行的,即有多个事务并发执行,并发执行就可能遇到问题,目前常见的问题如下:
    更新丢失:两个事务同时更新一行数据,最后一个事务的更新会覆盖掉第一个事务的更新,从而导致第一个事务更新的数据丢失,这是由于没有加造成的;
    脏读:一个事务看到了另一个事务未提交的更新数据;
    不可重复读:在同一事务中,多次读取同一数据却返回不同的结果;也就是有其他事务更改了这些数据;
    幻读:一个事务在执行过程中读取到了另一个事务已提交的插入数据;即在第一个事务开始时读取到一批数据,但此后另一个事务又插入了新数据并提交,此时第一个事务又读取这批数据但发现多了一条,即好像发生幻觉一样。


为了解决这些并发问题,需要通过数据库隔离级别来解决,在标准sql规范中定义了四种隔离级别:
    读未提交(Read Uncommitted):最低隔离级别,一个事务能读取到别的事务未提交的更新数据,很不安全,可能出现更新丢失、脏读、不可重复读、幻读;
    读已提交(Read Committed):一个事务能读取到别的事务提交的更新数据,不能看到未提交的更新数据,不可能可能出现丢失更新、脏读,但可能出现不可重复读、幻读;
    可重复读(Repeatable Read):保证同一事务中先后执行的多次查询将返回同一结果,不受其他事务影响,可能可能出现丢失更新、脏读、不可重复读,但可能出现幻读;
    序列化(Serializable):最高隔离级别,不允许事务并发执行,而必须串行化执行,最安全,不可能出现更新、脏读、不可重复读、幻读。

数据库事务类型有本地事务和分布式事务:
    地事务:普通事务,单台数据库操作的ACID;
    分布式事务:即跨越多台同类或异类数据库的事务。
Java事务类型有JDBC事务和JTA事务:
    JDBC事务:通过Connection对象的控制来管理事务;
    JTA事务:JTA指Java事务api(Java Transaction API),是Java EE数据库事务规范, JTA只提供了事务管理接口,由应用程序服务器厂商(如WEBSphere Application Server)提供实现,JTA事务比JDBC更强大,支持分布式事务。


在JDBC模式下,由程序员获取数据库连接、执行数据操作并控制事务,如:

package com.invicme.apps.tx.jdbc;

import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;


public class DbHelper {
    
    private static String driver = null;
    private static String url = null;
    private static String username = null;
    private static String passWord = null;
    static {
        // 该properties配置文件与工具类位于同一目录下
        InputStream in = DbHelper.class.getResourceAsStream("jdbc.properties");
        Properties props = new Properties();
        try {
            props.load(in);
        } catch (IOException e) {
            e.printStackTrace();
        }
        driver = props.getProperty("jdbc.driver");
        url = props.getProperty("jdbc.url");
        username = props.getProperty("jdbc.username");
        password = props.getProperty("jdbc.password");
    }
    
    
    public Connection getCon () {
        Connection con = null;
        try {
            Class.forName(driver).newInstance();     // Mysql驱动
            con = DriverManager.getConnection(url, username, password); // 链接本地mysql
        } catch (Exception e) {
            con = null;
            e.printStackTrace();
        }
        return con;
    }
    
    
    public void closeCon (Connection con) throws SQLException {
        if (null != con) {
            con.close();
        }
    }
    
}


单元测试

package com.test.apps.spring.tx;

import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.SQLException;
import java.sql.Statement;

import org.apache.log4j.Logger;
import org.junit.Test;

import com.invicme.apps.tx.jdbc.DbHelper;


public class TestJdbcTransaction {
    // 
    private static final Logger logger = Logger.getLogger(TestJdbcTransaction.class);
    
    @Test
    public void testJdbcTransaction () {
        DbHelper dbHelper = new DbHelper();
        Connection con = dbHelper.getCon();
        
        try {
            DatabaseMetaData metaData = con.getMetaData();
            
            // MySQL
            String databaseProductName = metaData.getDatabaseProductName();
            // 5.6.17-log
            String databaseProductVersion = metaData.getDatabaseProductVersion();
            // 5
            int databaseMajorVersion = metaData.getDatabaseMajorVersion();
            // 6
            int databaseMinorVersion = metaData.getDatabaseMinorVersion();
            
            // MySQL 5.6.17-log
            logger.info(databaseProductName + " " + databaseProductVersion);
            // 5.6
            logger.info(databaseMajorVersion + "." + databaseMinorVersion);
            
            int defaultTransactionIsolation = metaData.getDefaultTransactionIsolation();
            // 事务隔离级别:2
            logger.info(defaultTransactionIsolation);
            boolean supportsTransactions = metaData.supportsTransactions();
            // 是否支持事务:true
            logger.info(supportsTransactions);
            
            String driverName = metaData.getDriverName();
            String driverVersion = metaData.getDriverVersion();
            int driverMajorVersion = metaData.getDriverMajorVersion();
            int driverMinorVersion = metaData.getDriverMinorVersion();
            // MySQL Connector Java
            logger.info(driverName);
            // mysql-connector-java-5.1.38 ( Revision: fe541c166cec739c74cc727c5da96c1028b4834a )
            logger.info(driverVersion);
            // 5.1
            logger.info(driverMajorVersion + "." + driverMinorVersion);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        
        try {
            // 关闭自动提交
            con.setAutoCommit(false);
            
            Statement statement = con.createStatement();
            
            statement.executeUpdate("update user set name='zhangsan' where name='lisi' ");
            
            // 事务提交
            con.commit();
        } catch (SQLException e) {
            e.printStackTrace();
            // 事务回滚
            try {
                con.rollback();
            } catch (SQLException e1) {
                e1.printStackTrace();
            }
        } finally {
            try {
                dbHelper.closeCon(con);
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

    说明:

    在JDBC2.0中,事务只能进行commit或rollback;而JDBC3.0引入了保存点特性,即允许将事务分割为多个阶段。

Savepoint savepoint = con.setSavepoint("svpt");
// ......
con.rollback(savepoint);


    Spring简化了这个过程,提供了两种事务控制方式,即:声明式事务(注解方式和XML配置方式)和编程式事务。

您可能感兴趣的文档:

--结束END--

本文标题: Spring学习笔记事务(一)

本文链接: https://www.lsjlt.com/news/44054.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Spring学习笔记事务(一)
    鲁春利的工作笔记,好记性不如烂笔头事务是一系列操作组成的工作单元,是不可分割的,即要么所有操作都做,要么所有操作都不做,这就是事务。事务必需满足ACID(原子性、一致性、隔离性和持久性)特性,缺一不可:&n...
    99+
    2022-10-18
  • Redis学习笔记(二十一) 事务
    文章开始啰嗦两句,写到这里共21篇关于redis的琐碎知识,没有过多的写编程过程中redis的应用,着重写的是redis命令、客户端、服务器以及生产环境搭建用到的主从、哨兵、集群实现原理,如果你真的能看的进去,相信对你在以后用到r...
    99+
    2017-07-23
    Redis学习笔记(二十一) 事务
  • Spring学习笔记(一)【BeanUtils.copyProperties方法】
    Spring下的BeanUtils.copyProperties方法是深拷贝还是浅拷贝? 一、浅拷贝深拷贝的理解 简单地说,拷贝就是将一个类中的属性拷贝到另一个中,对于BeanUtils.copyP...
    99+
    2023-09-04
    spring 学习 java
  • MySQL 学习笔记 (一)
    1.InnoDB and Online DDL ALTER TABLE tbl_name ADD PRIMARY KEY (column), ALGORITHM=INPLACE, LOCK=NONE; https://dev.mysql.c...
    99+
    2016-12-04
    MySQL 学习笔记 (一)
  • NumPy 学习笔记(一)
    NumPy:   1、NumPy 是一个功能强大的第三方库(需要自己安装),主要用于对多维数组执行计算;      它提供了大量的库函数和操作,可以帮助程序员更轻松地进行数值计算   2、可以和另外两个第三方库 SciPy 和 Matpl...
    99+
    2023-01-31
    学习笔记 NumPy
  • NumPy学习笔记(一)
    # NumPy### 安装- 通过安装Anaconda安装NumPy,一个开源的Python发行版本,其包含了conda、Python等180多个科学包及其依赖项,包含了大量的科学计算相关的包,其中就包括NumPy- 通过pip安装, ...
    99+
    2023-01-31
    学习笔记 NumPy
  • MySQL学习笔记(13):锁和事务
    本文更新于2019-09-22,使用MySQL 5.7,操作系统为Deepin 15.4。 目录锁锁概述MyISAM表级锁InnoDB行级锁InnoDB表级锁死锁事务事务概述InnoDB事务分布式事务 锁 锁概述 MyISAM和M...
    99+
    2015-05-30
    MySQL学习笔记(13):锁和事务
  • 如何在学习笔记中记录 Python Spring 的对象?一起来学习吧!
    Python Spring 是一个非常流行的框架,它可以帮助开发人员快速构建高质量的应用程序。在学习 Python Spring 的过程中,记录笔记是非常重要的一步。本篇文章将向您介绍如何在学习笔记中记录 Python Spring 的对象...
    99+
    2023-08-31
    spring 学习笔记 对象
  • Redis学习笔记(十一) 服务器
    Redis服务器负责与多个客户端建立网络通信,处理客户端发送的命令请求,在数据库中保存客户端执行命令所产生的数据,并通过资源管理来维持服务器自身的运转。   命令请求过程(以set命令为例)   1、客户端向服务器发送命令请求 S...
    99+
    2014-11-11
    Redis学习笔记(十一) 服务器
  • Java、Laravel和Spring:哪一个更适合学习笔记?
    Java、Laravel和Spring是当前最流行的编程语言和框架之一。对于想要学习编程的初学者来说,选择哪种编程语言和框架可能会感到困惑。在本文中,我们将讨论Java、Laravel和Spring三种编程语言和框架,并探讨哪一种更适合学习...
    99+
    2023-11-10
    laravel spring 学习笔记
  • Mysql命令学习笔记(一)
    一、安装/卸载Mysql数据库    #安装Mysql数据库    D:\mysql\bin>mysqld --inst...
    99+
    2022-10-18
  • 第一周Python学习笔记
     Python 基本语法: ①  Python程序的格式:1.用代码高亮来标识函数丶语句等等 本身的代码高亮并没有实际的意义,只是用来辅助编程人员和阅读人员 更好的识别    2.程序以缩进来标识语句,缩进用来标识代码间的层次关系,缩进的...
    99+
    2023-01-30
    学习笔记 第一周 Python
  • 【K210】K210学习笔记一——sensor
    【K210】K210学习笔记一——sensor 前言sensor的配置模块导入模块配置模块各配置解释 完整源码 前言 本人大四学生,电赛生涯已经走到尽头,一路上踩过不少坑,但运气也不错...
    99+
    2023-08-31
    学习 python 人工智能 单片机 图像处理
  • PHP学习笔记怎么同步Spring?
    随着互联网的快速发展,Web开发成为了一个非常热门的领域。PHP和Spring是Web开发中非常流行的两种技术,如何将二者进行同步是一个常见的问题。在本文中,我们将介绍如何使用PHP和Spring进行同步。 一、PHP简介 PHP是一种流...
    99+
    2023-09-16
    学习笔记 同步 spring
  • 学习笔记-TP5框架学习笔记\(路由\)
    TP5框架简单理解 (PS:只做粗略、关键知识的记录,TP程序的开始。详情请阅读官方手册) 1. 架构总览 TP程序的开始 PHP >=5.3.0, PHP7 ThinkPHP5.0应用基于MVC(模型-视图-控制器)的方...
    99+
    2023-10-25
    学习 php 开发语言
  • mysql学习笔记第三节 事务隔离
    事务隔离 事务隔离 事物的特性:ACID 原子性:Atomicity 一致性:consistency 隔离性:isolation 持久性:durability 隔离的利弊 隔离程度越高,效率就越低 标准SQL的隔离级别 ...
    99+
    2018-10-21
    mysql学习笔记第三节 事务隔离
  • 如何把ASP、Spring、Django学习笔记整合成一份?
    ASP、Spring、Django是三种常见的Web开发框架,它们各自有着不同的特点和优势。在学习这三种框架的过程中,你可能会发现自己的笔记零散而不成体系,难以整合成一份有用的学习笔记。本文将为你介绍如何将ASP、Spring、Djang...
    99+
    2023-10-11
    spring 学习笔记 django
  • 学习笔记-小甲鱼Python3学习第十一
    从列表中获取元素:列表索引值是从0开始的例把'郑十'和'王五'的位置调换一下>>> member['张三', '李四', '郑十', '王五', '赵六', '陈七', '马八', '孙九']>>> me...
    99+
    2023-01-31
    甲鱼 学习笔记
  • 学习笔记-小甲鱼Python3学习第一讲
    测试题: 0、python 是什么类型的语言?python是一种脚本语言 IDLE 是什么?是一种python shell,类似于windows的cmd窗口和linux的shell print() 的作用是什么?打印到窗口显示 a ...
    99+
    2023-01-31
    甲鱼 学习笔记
  • Python学习笔记一(Python数据
    Python数据类型主要包括数字,字符串,列表,元组和字典。字符串,列表,元组和字典都是序列,序列最主要两个特点是索引操作和切片操作,索引操作让我们从序列中抓取一个特定项目,切片操作让我们能够获取序列的一个切片,即一部分序列。1.数字 ...
    99+
    2023-01-31
    学习笔记 数据 Python
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作