广告
返回顶部
首页 > 资讯 > 数据库 >轻松获知数据库事务
  • 581
分享到

轻松获知数据库事务

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

标题索引事务作用事务流程隔离级别实例验证事务作用    事务是确保数据库系统数据的完整性的功能,如现在互联网行业支付业务,不管服务器出于什么原因异常中断,客户要么支付成功要么支付不成功,

标题索引


  • 事务作用

  • 事务流程

  • 隔离级别

  • 实例验证


事务作用

    事务是确保数据库系统数据的完整性的功能,如现在互联网行业支付业务,不管服务器出于什么原因异常中断,客户要么支付成功要么支付不成功,支付成功数据库金额即会发生变化,支付不成功客户的金额就不发生变化,确保了交易业务的稳定性。支持事物的引擎必须满足ACID,满足ACID后才能满足事物,另外事物的回滚或恢复主要靠事物日志来完成,ACID含义分别如下:

    A:atomicity(原子性):整个事物中所有的操作为命令执行最小单元,全部执行、执行一半失败回滚或失败回滚;

    C:consistency(一致性):数据库从一个状态转化为另外一个状态,状态在转化前和转换后一致;

    I:isolation(隔离性):一个事物所做出的操作在提交之前,是不能被其他所见,因此隔离就出现多种隔离级别,具体包括read-uncommitted读为提交、read-committed读提交、repeatable-read可重复读和serializable串行化;

    D:durability(持久性):一旦事物提交,所做的会永久性保存数据库中。

事务流程

    事务的工作流程具体可见下图

    轻松获知数据库事务

图1-1 事物工作流程

    由上图可知,当数据库通过start transaction启动一个事物,启动事物后对数据库进行一系列的操作,最后提交事物,提交事物又有两种,第一种为commit提交,第二种rollback回滚,一旦提交事物数据库即处于新的状态保持持久性。另外在防止数据库在事物提交后数据从内存写入磁盘时,操作系统异常掉电导致无法保存,而启用日志功能,只要启用事物日志功能,事物先在磁盘连续空间写写日志,然后通过内存同步到磁盘,确保万一内存同步磁盘时机器异常掉电,通过事物日志进行恢复数据库数据。

隔离级别

    隔离级别(INNODB默认隔离级别为repeatable read):

    READ UNCOMMITTED(读未提交):此种隔离级别带来问题有脏读和不可重复读。

    READ COMMITTED(读提交):此种隔离级别解决了脏读,但仍然有不可重复度。

    REPEATABLE READ(可重读):此种隔离级别解决了脏读和不可重复读,带来问题幻读。

    SERIALIZABLE(可串行化):此种隔离级别解决了脏读、不可重复度和幻读,但带来的问题是加读。

    问题解释:

    脏读:当用户A修改数据但未提交,此时B用户读A修改后的数据,但是A用户将数据进行rollback回滚,因此B用户看到的是错误的数据;

    不可重复读:如用户A启动一个事务设置某一值设为ON,经查询已经为ON状态,但B用户修改数值为OFF并提交,此时用户A再次查询时发现值又为OFF,或者数据库中又多了一条语句,表现为在同一事务中每次查询数据库总是不一致;

    幻读:当用户A用户在同一事务中看到某一值为ON,用户B已经将值修改为OFF,并且已经提交,用户B看到的值为OFF,但用户A在此事务中一直看到的为ON,底层数据确实被修改为OFF,因此就体现了幻读,除非提交后再次生成一个事务查看值才为OFF;

    加锁读:读数据时加锁,此时别人无法再读。

实例验证

    根据理论概述,进行验证事物的工作流程和隔离级别,确保透彻了解事物的原理,具体操作如下

MariaDB [(none)]> show processlist;                                      #查看数据库的进程列表,显示有两终端连接
+----+------+-----------+------+---------+------+-------+------------------+----------+
| Id | User | Host      | db   | Command | Time | State | Info             | Progress |
+----+------+-----------+------+---------+------+-------+------------------+----------+
|  2 | root | localhost | NULL | Sleep   |   23 |       | NULL             |    0.000 |
| 10 | root | localhost | NULL | Query   |    0 | NULL  | show processlist |    0.000 |
+----+------+-----------+------+---------+------+-------+------------------+----------+
2 rows in set (0.00 sec)
MariaDB [(none)]> show global variables like 'tx_isolation';           #验证事物的隔离级别
+---------------+-----------------+
| Variable_name | Value           |
+---------------+-----------------+
| tx_isolation  | REPEATABLE-READ |
+---------------+-----------------+
1 row in set (0.00 sec)

    验证隔离级别 READ UNCOMMITTED(存在脏读、不可重复读)

    第一步:创建表并插入数据

MariaDB [test]> create table employee(id int,name varchar(20),age char(3));                             #创建表
Query OK, 0 rows affected (0.00 sec)
MariaDB [test]> insert into employee  values(1,'tangseng',38),(2,'sunwukong',505),(3,'zhubajie',485),(4,'shaheshang',408);      #给表中添加用户
Query OK, 4 rows affected (0.01 sec)
Records: 4  Duplicates: 0  Warnings: 0

     第二步:在两个数据库连接线程的会话变量中设置隔离级别为READ-UNCOMMITTED

会话1
MariaDB [(none)]> set tx_isolation='READ-UNCOMMITTED';
Query OK, 0 rows affected (0.00 sec)
MariaDB [test]> start transaction;                 #开启事物
Query OK, 0 rows affected (0.00 sec)
会话2
MariaDB [(none)]> set tx_isolation='READ-UNCOMMITTED';
Query OK, 0 rows affected (0.00 sec)
MariaDB [(none)]>
MariaDB [test]> start transaction;                 #开启事物
Query OK, 0 rows affected (0.00 sec)

    第三步:两边同时启用事物,其中会话1添加bailongma,但不提交,在会话2上查看验证

会话1                     #插入数据但未提交,会话2上查询后验证
MariaDB [test]> insert into employee values(5,'bailongma',300);
Query OK, 1 row affected (0.00 sec)
会话2                     #经查询验证会话1尚未提交已经可以读取,若会话1回滚,会话2读取数据为脏数据
MariaDB [test]> select * from employee;
+------+------------+------+
| id   | name       | age  |
+------+------------+------+
|    1 | tangseng   | 38   |
|    2 | sunwukong  | 505  |
|    3 | zhubajie   | 485  |
|    4 | shaheshang | 408  |
|    5 | bailongma  | 300  |
+------+------------+------+
5 rows in set (0.00 sec)

    验证隔离级别READ-COMMITTED(解决脏读问题,存在不可重复读)

    第一步:创建表并插入数据

MariaDB [test]> create table employee(id int,name varchar(20),age char(3));                             #创建表
Query OK, 0 rows affected (0.00 sec)
MariaDB [test]> insert into employee  values(1,'tangseng',38),(2,'sunwukong',505),(3,'zhubajie',485),(4,'shaheshang',408);      #给表中添加用户
Query OK, 4 rows affected (0.01 sec)
Records: 4  Duplicates: 0  Warnings: 0

     第二步:在两个数据库连接线程的会话变量中设置隔离级别为READ-COMMITTED

会话1
MariaDB [(none)]> set tx_isolation='READ-COMMITTED';
Query OK, 0 rows affected (0.00 sec)
MariaDB [test]> start transaction;              #开启事务
Query OK, 0 rows affected (0.00 sec)
会话2
MariaDB [(none)]> set tx_isolation='READ-COMMITTED';
Query OK, 0 rows affected (0.00 sec)
MariaDB [test]> start transaction;              #开启事务
Query OK, 0 rows affected (0.00 sec)

    第三步:在两个连接数据库的线程进程添加bailongma,但不提交进行验证

会话1
MariaDB [test]> insert into employee values(5,'bailongma',305);
Query OK, 1 row affected (0.00 sec)
会话2              #在会话1未提交时,会话2是无法读取数据
MariaDB [test]> select * from employee;
+------+------------+------+
| id   | name       | age  |
+------+------------+------+
|    1 | tangseng   | 38   |
|    2 | sunwukong  | 505  |
|    3 | zhubajie   | 485  |
|    4 | shaheshang | 408  |
+------+------------+------+
4 rows in set (0.00 sec)

    第四步:在连会话1上进行提交,然后在会话2上进行验证

会话1
MariaDB [test]> commit;
Query OK, 0 rows affected (0.00 sec)
会话2                 
MariaDB [test]> select * from employee;
+------+------------+------+
| id   | name       | age  |
+------+------------+------+
|    1 | tangseng   | 38   |
|    2 | sunwukong  | 505  |
|    3 | zhubajie   | 485  |
|    4 | shaheshang | 408  |
|    5 | bailongma  | 305  |
+------+------------+------+
5 rows in set (0.00 sec)    #说明读提交可以解决脏读的问题

    验隔离级别REPEATABLE READ(解决脏读和重复读的问题,带来新的问题幻读)

    第一步:创建表并插入数据

MariaDB [test]> create table employee(id int,name varchar(20),age char(3));                             #创建表
Query OK, 0 rows affected (0.00 sec)
MariaDB [test]> insert into employee  values(1,'tangseng',38),(2,'sunwukong',505),(3,'zhubajie',485),(4,'shaheshang',408);      #给表中添加用户
Query OK, 4 rows affected (0.01 sec)
Records: 4  Duplicates: 0  Warnings: 0

    第二步:在两个数据库连接线程的会话变量中设置隔离级别为REPEATABLE-READ

会话1
MariaDB [(none)]> set tx_isolation='REPEATABLE-READ';
Query OK, 0 rows affected (0.00 sec)
MariaDB [test]> start transaction;              #开启事务
Query OK, 0 rows affected (0.00 sec)
会话2
MariaDB [(none)]> set tx_isolation='REPEATABLE-READ';
Query OK, 0 rows affected (0.00 sec)
MariaDB [test]> start transaction;              #开启事务
Query OK, 0 rows affected (0.00 sec)

    第三步:先会话2中开启一个事物查询表中数据,然后在会话1中添加bailongma用户,再次在会话2中的同一事务中查看表中数据(发现会话1中数据已经发生变化,会话2的同一事物中任然是之前的数据,因此解决了事物的可重复读)

会话2           #开启一个事物并查询表中数据
MariaDB [test]> select * from employee;
+------+------------+------+
| id   | name       | age  |
+------+------------+------+
|    1 | tangseng   | 38   |
|    2 | sunwukong  | 505  |
|    3 | zhubajie   | 485  |
|    4 | shaheshang | 408  |
+------+------------+------+
4 rows in set (0.00 sec)
会话1        #添加bailongma数据后,提交并查询
MariaDB [test]> insert into employee values(5,'bailongma',305);
Query OK, 1 row affected (0.00 sec)

MariaDB [test]> commit;
Query OK, 0 rows affected (0.00 sec)
MariaDB [test]> select * from employee;
+------+------------+------+
| id   | name       | age  |
+------+------------+------+
|    1 | tangseng   | 38   |
|    2 | sunwukong  | 505  |
|    3 | zhubajie   | 485  |
|    4 | shaheshang | 408  |
|    5 | bailongma  | 305  |
+------+------------+------+
5 rows in set (0.00 sec)
会话2      #在会话2上再次查询,结果任然是4条数据,原因是会话2上的事物并未提交,并且解决了可重复读,因此只能看到4条,除非提交事物后再次查询;
MariaDB [test]> select * from employee;
+------+------------+------+
| id   | name       | age  |
+------+------------+------+
|    1 | tangseng   | 38   |
|    2 | sunwukong  | 505  |
|    3 | zhubajie   | 485  |
|    4 | shaheshang | 408  |
+------+------------+------+
4 rows in set (0.00 sec)
MariaDB [test]> select * from employee;
+------+------------+------+
| id   | name       | age  |
+------+------------+------+
|    1 | tangseng   | 38   |
|    2 | sunwukong  | 505  |
|    3 | zhubajie   | 485  |
|    4 | shaheshang | 408  |
|    5 | bailongma  | 305  |
+------+------------+------+
5 rows in set (0.00 sec)

    验隔离级别SERIALIZABLE(解决重复读的问题,需注意每次操作都需要重启新的事物和提交,因为有加锁,一个事物只能是一组语句)

     第一步:创建表并插入数据

MariaDB [test]> create table employee(id int,name varchar(20),age char(3));                             #创建表
Query OK, 0 rows affected (0.00 sec)
MariaDB [test]> insert into employee  values(1,'tangseng',38),(2,'sunwukong',505),(3,'zhubajie',485),(4,'shaheshang',408);      #给表中添加用户
Query OK, 4 rows affected (0.01 sec)
Records: 4  Duplicates: 0  Warnings: 0

    第二步:在两个数据库连接线程的会话变量中设置隔离级别为SERIALIZABLE

会话1
MariaDB [(none)]> set tx_isolation='SERIALIZABLE';
Query OK, 0 rows affected (0.00 sec)
MariaDB [test]> start transaction;              #开启事物
Query OK, 0 rows affected (0.00 sec)
会话2
MariaDB [(none)]> set tx_isolation='SERIALIZABLE';
Query OK, 0 rows affected (0.00 sec)
MariaDB [test]> start transaction;              #开启事物
Query OK, 0 rows affected (0.00 sec)

    第三步:当会话1上进行插入bailongma用户前,在会话2上进查询并提交,会话1添加bailongma并提交,然后再次在会话2上进行查询

会话1       #添加用户后,并未提交
MariaDB [test]> insert into employee values(5,'bailongma',305);
Query OK, 1 row affected (0.00 sec)
会话2       #在会话1上未提交时,会话1对表进行加锁,因此会话2上时无法查询,因此解决幻读
MariaDB [test]> select * from employee;
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction


您可能感兴趣的文档:

--结束END--

本文标题: 轻松获知数据库事务

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

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

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

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

下载Word文档
猜你喜欢
  • 轻松获知数据库事务
    标题索引事务作用事务流程隔离级别实例验证事务作用    事务是确保数据库系统数据的完整性的功能,如现在互联网行业支付业务,不管服务器出于什么原因异常中断,客户要么支付成功要么支付不成功,...
    99+
    2022-10-18
  • Python+SQLAlchemy轻松实现管理数据库
    目录一、安装SQLAlchemy二、创建数据模型三、设置数据库连接四、CRUD操作五、关联和外键在这篇文章中,我们将学习如何使用Python和SQLAlchemy库来轻松管理数据库。...
    99+
    2023-05-12
    Python SQLAlchemy管理数据库 Python SQLAlchemy数据库 Python SQLAlchemy
  • 使用阿里云数据库服务器轻松管理您的数据
    在今天的数字化时代,数据成为了企业的重要资产,而如何安全、高效地管理这些数据成为了企业关注的焦点。本文将详细介绍如何使用阿里云数据库服务器来管理您的数据。 一、什么是阿里云数据库服务器?阿里云数据库服务器是阿里云推出的一款高性能、易用的数据...
    99+
    2023-12-09
    您的 阿里 轻松
  • 阿里云数据库建表轻松实现数据管理
    随着互联网的快速发展,数据成为了企业的重要资产。为了有效地管理这些数据,企业需要使用数据库。本文将详细介绍如何在阿里云数据库中建表,以便更轻松地进行数据管理。 一、阿里云数据库简介阿里云数据库是阿里云推出的一款高性能、可扩展、易于管理的数据...
    99+
    2023-11-16
    阿里 数据管理 轻松
  • 深入了解MySQL数据库事务知识
    下文主要给大家带来MySQL数据库事务知识,希望这些内容能够带给大家实际用处,这也是我编辑MySQL数据库事务知识这篇文章的主要目的。好了,废话不多说,大家直接看下文吧。一、前言只有InnoDB引擎支持事务...
    99+
    2022-10-18
  • 你知道吗?PHP可以轻松处理海量文件数据
    当今时代,数据的重要性越来越被人们所认可,无论是在企业中还是在个人生活中,我们都需要处理大量的数据。而PHP作为一门流行的Web开发语言,它可以轻松处理海量文件数据。 一、PHP的文件操作函数 PHP的文件操作函数可以让我们轻松地读取、写入...
    99+
    2023-08-27
    大数据 编程算法 文件
  • 10个教程教你轻松备份MySQL数据库
      今天,小编为大家收集了一些非常有用的MySQL数据库备份教程。在开源数据库管理系统中,MySQL是最好并且应用最为广泛的系统。在下面的教程当中,将帮助大家学习如何进行MySQL数据库的备份,定期备份数据库对开...
    99+
    2022-05-13
    MySQL 数据库
  • 阿里云装数据库主机轻松部署数据库解决方案
    随着云计算的发展,企业对于数据库的需求也在不断增长。阿里云装数据库主机是阿里云提供的一款简单易用的数据库解决方案,可以帮助企业快速、轻松地部署和管理数据库。本文将详细介绍阿里云装数据库主机的特点、优势和使用方法,帮助您更好地理解和使用这款产...
    99+
    2023-11-11
    数据库 阿里 解决方案
  • 轻松精通数据库管理之道——运维巡检之二(数据库)
    前言  做好日常巡检是数据库管理和维护的重要步骤,而且需要对每次巡检日期、结果进行登记,同时可能需要出一份巡检报告。  本系列旨在解决一些常见的困扰:不知道巡检哪些东西不知道怎么样便捷体检机器太多体检麻烦生...
    99+
    2022-10-18
  • 阿里云数据库同步数据轻松实现跨平台数据同步
    随着互联网技术的不断发展,数据的同步需求日益增长。尤其是在跨平台应用开发中,如何实现不同平台之间的数据同步,成为了开发者需要解决的重要问题。本文将介绍阿里云数据库同步数据的相关功能和使用方法,帮助您轻松实现跨平台数据同步。 一、阿里云数据库...
    99+
    2023-11-04
    阿里 轻松 数据同步
  • 数据库导入阿里云轻松实现数据迁移与管理
    随着互联网技术的不断发展,数据已成为企业运营的关键资源。在海量数据中,如何高效地进行数据管理,已成为企业面临的重大挑战。本文将介绍如何使用阿里云数据库服务,轻松实现数据迁移与管理。 随着互联网技术的不断发展,数据已成为企业运营的关键资源。然...
    99+
    2023-11-03
    阿里 轻松 数据库
  • 如何用Python轻松开发数据库取数下载工具
    本篇文章给大家分享的是有关如何用Python轻松开发数据库取数下载工具,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。 1  简介这是我的系列教程「Pytho...
    99+
    2023-06-15
  • 数据库事务
    事务的四个特性 (ACID) ,分别是原子性( Atomicity), 一致性( Consistency), 隔离性( Isolation), 持久性( Durability)。一致性是事务的目的,原子性,...
    99+
    2022-10-18
  • 你知道吗?Python 和 NumPy 能够轻松处理文件中的数字数据!
    数字数据在我们的生活中无处不在,从金融数据到科学实验数据,数字数据的处理成为了我们日常工作中不可或缺的一部分。Python 作为一种高级编程语言,拥有强大的数据处理和分析能力,同时 NumPy 作为 Python 的扩展库,在数字计算和处...
    99+
    2023-11-04
    文件 关键字 numy
  • 阿里云数据库下载教程让你轻松上手
    阿里云数据库是中国最大的云计算服务提供商之一,提供了丰富的数据库产品和服务,包括关系型数据库、非关系型数据库、NoSQL数据库等。如果你想要在自己的服务器上运行阿里云数据库,或者想要下载相关的数据库文件,那么这篇教程将为你提供详细的指导。 ...
    99+
    2023-11-23
    让你 阿里 上手
  • 阿里云导入数据库jar包如何轻松完成数据迁移
    在进行数据库迁移时,将大量数据从一个数据库系统迁移到另一个数据库系统是一项繁琐而耗时的任务。阿里云提供了一种方便的方式来解决这个问题:导入数据库jar包。本文将详细介绍如何使用阿里云导入数据库jar包来实现快速、高效的数据迁移。 阿里云导入...
    99+
    2024-01-01
    阿里 轻松 数据库
  • spring事务与数据库事务
    事务的ACID属性 A(Atomicity):原子性,事务要么都成功,要么都失败,是一个整体 C(Consistency):一致性,事务前后数据保持一致,如张三去银行取钱,取了500,则张三到手500,银行扣除500,总数不变 I(I...
    99+
    2015-03-25
    spring事务与数据库事务
  • 你知道吗?ASP 日志 api 接口可以轻松实现数据采集!
    在当今数字化时代,数据采集变得越来越重要,尤其是在互联网应用程序中。ASP 日志 api 接口就是一种能够轻松实现数据采集的工具。本文将向你介绍什么是 ASP 日志 api 接口以及如何使用它来进行数据采集。 什么是 ASP 日志 api...
    99+
    2023-06-19
    日志 api 接口
  • 填报脚本之轻松搞定复杂表的数据入库
    你还认为填报表只能完成标准行列布局的数据填报?还在因表样复杂,填报分片错乱,设计不够灵活而苦恼?还在为业务填报表样设计灵活,但数据不能实时入库而感到惋惜?那要先“祝贺”看到这段话的你了,这个难题遇到集算器脚本迎刃而解了。(撒花撒花….)下面...
    99+
    2023-06-02
  • 轻松精通数据库管理之道——运维巡检系列
      巡检是数据库管理员保证数据库健康的必要维护项,全面的巡检可以及早的发现问题、解决问题、预防问题。  很多数据库维护人员其实对数据库了解的并不深入(常常集中在传统行业),不是专业的DBA,同时又身兼多职(...
    99+
    2022-10-18
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作