热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

linux进阶MySQL事务小结

MySQL事务小结文章目录MySQL事务小结1.事务日志的配置项2.ACID测试3.事务控制语句4.MYSQL事务处理主要有两种方法5.事务隔离MVCC和事务的隔离级别࿱

MySQL事务小结


文章目录

  • MySQL事务小结
    • 1.事务日志的配置项
    • 2.ACID测试
    • 3.事务控制语句
    • 4.MYSQL 事务处理主要有两种方法
    • 5.事务隔离
      • MVCC和事务的隔离级别:
      • 指定事务隔离级别:
    • 6.事务回滚案例

MySQL 事务主要用于处理操作量大,复杂度高的数据。
比如说:在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务!- 在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。- 事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行。- 事务用来管理 insert,update,delete 语句

1.事务日志的配置项

innodb_log_files_in_group
innodb_log_group_home_dir
innodb_log_file_size
innodb_mirrored_log_groups

2.ACID测试

一般来说,事务是必须满足4个条件(ACID测试):原子性(Atomicity,或称不可分割性)#整个事务中的所有操作要么全部成功执行,要么全部失败后回滚一致性(Consistency)#数据库总是从一个一致性状态转换为另一个一致性状态隔离性(Isolation,又称独立性) #一个事务所做出的操作在提交之前,是不能为其它事务所见;隔离有多种隔
离级别,实现并发持久性(Durability)#一旦事务提交,其所做的修改会永久保存于数据库中

Transaction生命周期
在这里插入图片描述


  • 原子性:

一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。
事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。

  • 一致性:

在事务开始之前和事务结束以后,数据库的完整性没有被破坏。
这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。

  • 隔离性:

数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。
事务隔离分为不同级别,包括读未提交(Read uncommitted)读提交(read committed)可重复读(repeatable read)串行化(Serializable)

  • 持久性:

事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。

3.事务控制语句


  • BEGIN 或 START TRANSACTION 显式地开启一个事务;

  • COMMIT 也可以使用 COMMIT WORK,不过二者是等价的。COMMIT 会提交事务,并使已对数据库进行的所有修改成为永久性的;

  • ROLLBACK 也可以使用 ROLLBACK WORK,不过二者是等价的。回滚会结束用户的事务,并撤销正在进行的所有未提交的修改;

  • SAVEPOINT identifier,SAVEPOINT 允许在事务中创建一个保存点,一个事务中可以有多个 SAVEPOINT;

  • RELEASE SAVEPOINT identifier 删除一个事务的保存点,当没有指定的保存点时,执行该语句会抛出一个异常;

  • ROLLBACK TO identifier 把事务回滚到标记点;

  • SET TRANSACTION 用来设置事务的隔离级别。InnoDB 存储引擎提供事务的隔离级别有READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ 和 SERIALIZABLE。

MariaDB [bokebi]> select @@autocommit; #查询自动提交事务设置
+--------------+
| @@autocommit |
+--------------+
| 1 |
+--------------+
1 row in set (0.00 sec)
---------------------------------------------------------------------------------
在 MySQL 命令行的默认设置下,事务都是自动提交的,即执行 SQL 语句后就会马上执行 COMMIT 操作。
因此要显式地开启一个事务务须使用命令 BEGINSTART TRANSACTION,或者执行命令 SET AUTOCOMMIT=0,用来禁止使用当前会话的自动提交。

4.MYSQL 事务处理主要有两种方法

1.用 BEGIN, ROLLBACK, COMMIT来实现

- BEGIN 开始一个事务- ROllBACK 事务回滚- COMMIT 事务确认

2.直接用 SET 来改变 MySQL 的自动提交模式:

- SET AUTOCOMMIT=0/false 禁止自动提交- SET AUTOCOMMIT=1/true 开启自动提交
-

3.查看事务

#查看当前的事务
- SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX;#查看当前锁定的事务
- SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;#查看当前等锁的事务
- SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;

5.事务隔离

事务隔离级别:
READ-UNCOMMITTED:可读取到未提交数据 --> 脏读READ-COMMITTED:可读取到提交数据,但未提交数据不可读,产生不可重复读,即可读取到多个提交数据,导致每次
读取数据不一致--> 不可重复读REPEATABLE-READ:可重复读,多次读取数据都一致,产生幻读,即读取过程中,即使有其它提交的事务修改数据,仍
只能读取到未修改前的旧数据。此为MySQL默认设置 --> 幻读,MySQL的默认级别SERIALIZABLE:可串行化,未提交的读事务阻塞修改事务(加读锁,但不阻塞读事务),或者未提交的修改事务阻
塞读事务(加写锁,其它事务的读,写都不可以执行)。会导致并发性能差
--------------------------------------------------------------------------------
查看事务隔离级别:
SELECT @@session.tx_isolation;
-----------------------------------------------------------------
查看InnoDB存储引擎的状态信息:
SHOW ENGINE innodb STATUS;

MVCC和事务的隔离级别:

MVCC(多版本并发控制机制)只在REPEATABLE READREAD COMMITTED两个隔离级别下工作。
其他两个隔离级别都和MVCC不兼容,因为READUNCOMMITTED总是读取最新的数据行,而不是符合当前事务版本的数据行。
SERIALIZABLE则会对所有读取的行都加锁

指定事务隔离级别:

1. 服务器变量tx_isolation指定,默认为REPEATABLE-READ,可在GLOBALSESSION级进行设置
SET tx_isolation=''READ-UNCOMMITTEDREAD-COMMITTEDREPEATABLE-READSERIALIZABLE2. 服务器选项中指定
vim /etc/my.cnf
[mysqld]
transaction-isolation=SERIALIZABLE死锁:两个或多个事务在同一资源相互占用,并请求锁定对方占用的资源的状态

6.事务回滚案例

简单的事务回滚

MariaDB [bokebi]> CREATE TABLE bokebi_test(id int(5)) engine=innodb;
Query OK, 0 rows affected (0.00 sec)MariaDB [bokebi]> SELECT * FROM bokebi_test;
Empty set (0.00 sec)MariaDB [bokebi]> BEGIN;
Query OK, 0 rows affected (0.00 sec)MariaDB [bokebi]> INSERT INTO bokebi_test VALUE(5);
Query OK, 1 row affected (0.00 sec)MariaDB [bokebi]> INSERT INTO bokebi_test VALUE(6);
Query OK, 1 row affected (0.00 sec)MariaDB [bokebi]> INSERT INTO bokebi_test VALUE(7);
Query OK, 1 row affected (0.00 sec)MariaDB [bokebi]> COMMIT;
Query OK, 0 rows affected (0.00 sec)MariaDB [bokebi]> SELECT * FROM bokebi_test;
+------+
| id |
+------+
| 5 |
| 6 |
| 7 |
+------+
3 rows in set (0.00 sec)MariaDB [bokebi]> BEGIN; #开始事务
Query OK, 0 rows affected (0.00 sec)MariaDB [bokebi]> INSERT INTO bokebi_test VALUE(1);
Query OK, 1 row affected (0.00 sec)MariaDB [bokebi]> INSERT INTO bokebi_test VALUE(2);
Query OK, 1 row affected (0.00 sec)MariaDB [bokebi]> INSERT INTO bokebi_test VALUE(3);
Query OK, 1 row affected (0.00 sec)MariaDB [bokebi]> SELECT * FROM bokebi_test;
+------+
| id |
+------+
| 5 |
| 6 |
| 7 |
| 1 |
| 2 |
| 3 |
+------+
6 rows in set (0.00 sec)MariaDB [bokebi]> ROLLBACK; #进行回滚
Query OK, 0 rows affected (0.00 sec)MariaDB [bokebi]> SELECT * FROM bokebi_test; #回到了我们对表操作前的数据
+------+
| id |
+------+
| 5 |
| 6 |
| 7 |
+------+
3 rows in set (0.00 sec)MariaDB [bokebi]>

在事务中添加回滚点,从而进行选择性回滚

MariaDB [bokebi]> SELECT * FROM bokebi_test;
+------+
| id |
+------+
| 5 |
| 6 |
| 7 |
+------+
3 rows in set (0.00 sec)MariaDB [bokebi]> BEGIN; #开始事务
Query OK, 0 rows affected (0.00 sec)MariaDB [bokebi]> SAVEPOINT rollback_point1; #添加回滚点1
Query OK, 0 rows affected (0.00 sec)MariaDB [bokebi]> INSERT INTO bokebi_test values(1);
Query OK, 1 row affected (0.00 sec)MariaDB [bokebi]> SAVEPOINT rollback_point2; #添加回滚点2
Query OK, 0 rows affected (0.00 sec)MariaDB [bokebi]> INSERT INTO bokebi_test values(2);
Query OK, 1 row affected (0.00 sec)MariaDB [bokebi]> SAVEPOINT rollback_point3; #添加回滚点3
Query OK, 0 rows affected (0.00 sec)MariaDB [bokebi]> INSERT INTO bokebi_test values(3);
Query OK, 1 row affected (0.00 sec)MariaDB [bokebi]> SELECT * FROM bokebi_test;
+------+
| id |
+------+
| 5 |
| 6 |
| 7 |
| 1 |
| 2 |
| 3 |
+------+
6 rows in set (0.00 sec)MariaDB [bokebi]> ROLLBACK TO rollback_point3; #回滚至回滚点3
Query OK, 0 rows affected (0.00 sec)MariaDB [bokebi]> SELECT * FROM bokebi_test;
+------+
| id |
+------+
| 5 |
| 6 |
| 7 |
| 1 |
| 2 |
+------+
5 rows in set (0.00 sec)MariaDB [bokebi]> ROLLBACK TO rollback_point2; #回滚至回滚点2
Query OK, 0 rows affected (0.00 sec)MariaDB [bokebi]> SELECT * FROM bokebi_test;
+------+
| id |
+------+
| 5 |
| 6 |
| 7 |
| 1 |
+------+
4 rows in set (0.00 sec)MariaDB [bokebi]> ROLLBACK TO rollback_point1; #回滚至回滚点1
Query OK, 0 rows affected (0.00 sec)MariaDB [bokebi]> SELECT * FROM bokebi_test;
+------+
| id |
+------+
| 5 |
| 6 |
| 7 |
+------+
3 rows in set (0.00 sec)MariaDB [bokebi]>

推荐阅读
  • MySQL数据库锁机制及其应用(数据库锁的概念)
    本文介绍了MySQL数据库锁机制及其应用。数据库锁是计算机协调多个进程或线程并发访问某一资源的机制,在数据库中,数据是一种供许多用户共享的资源,如何保证数据并发访问的一致性和有效性是数据库必须解决的问题。MySQL的锁机制相对简单,不同的存储引擎支持不同的锁机制,主要包括表级锁、行级锁和页面锁。本文详细介绍了MySQL表级锁的锁模式和特点,以及行级锁和页面锁的特点和应用场景。同时还讨论了锁冲突对数据库并发访问性能的影响。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • MySQL锁--(深入浅出读书笔记)
    MySQL锁的概述1.针对不同的引擎,采用不同的锁机制;(表锁,页面锁,行锁)myisam和memory存储引擎:表级锁;BOB存储引擎:页面锁,表级 ... [详细]
  • PostgreSQL13.1中文手册 ... [详细]
  • 视图分区_组复制常规操作网络分区amp;混合使用IPV6与IPV4 | 全方位认识 MySQL 8.0 Group Replication...
    网络分区对于常规事务而言,每当组内有事务数据需要被复制时,组内的成员需要达成共识(要么都提交,要么都回滚)。对于组成员资格的变更也和保持组 ... [详细]
  • 【BUUCTF】[极客大挑战 2019]LoveSQL 详细题解总结笔记 Writeup
    【BUUCTF】[极客大挑战2019]LoveSQL一.SQL注入考点二.解题过程0.存在SQL注入1.万能密码adminor112.爆字段3.看回显4.爆数据库5.爆数据库的表6 ... [详细]
  • MFC程序连接MySQL成功实现查询功能,但无法实现修改操作——详解查询语句在MySQL中的使用过程
    selectxxx,xxx,xxxfromxxxwherexxxxxx,xxxxxx程序的日常开发中,我们经常会写到各种各样的简单的,复杂的查询sql语 ... [详细]
  • r2dbc配置多数据源
    R2dbc配置多数据源问题根据官网配置r2dbc连接mysql多数据源所遇到的问题pom配置可以参考官网,不过我这样配置会报错我并没有这样配置将以下内容添加到pom.xml文件d ... [详细]
  • MySQL中的MVVC多版本并发控制机制的应用及实现
    本文介绍了MySQL中MVCC的应用及实现机制。MVCC是一种提高并发性能的技术,通过对事务内读取的内存进行处理,避免写操作堵塞读操作的并发问题。与其他数据库系统的MVCC实现机制不尽相同,MySQL的MVCC是在undolog中实现的。通过undolog可以找回数据的历史版本,提供给用户读取或在回滚时覆盖数据页上的数据。MySQL的大多数事务型存储引擎都实现了MVCC,但各自的实现机制有所不同。 ... [详细]
  • 本文介绍了如何使用PHP代码将表格导出为UTF8格式的Excel文件。首先,需要连接到数据库并获取表格的列名。然后,设置文件名和文件指针,并将内容写入文件。最后,设置响应头部,将文件作为附件下载。 ... [详细]
  • Todayatworksomeonetriedtoconvincemethat:今天在工作中有人试图说服我:{$obj->getTableInfo()}isfine ... [详细]
  • Activiti7流程定义开发笔记
    本文介绍了Activiti7流程定义的开发笔记,包括流程定义的概念、使用activiti-explorer和activiti-eclipse-designer进行建模的方式,以及生成流程图的方法。还介绍了流程定义部署的概念和步骤,包括将bpmn和png文件添加部署到activiti数据库中的方法,以及使用ZIP包进行部署的方式。同时还提到了activiti.cfg.xml文件的作用。 ... [详细]
  • 数据库锁的分类和应用
    本文介绍了数据库锁的分类和应用,包括并发控制中的读-读、写-写、读-写/写-读操作的问题,以及不同的锁类型和粒度分类。同时还介绍了死锁的产生和避免方法,并详细解释了MVCC的原理以及如何解决幻读的问题。最后,给出了一些使用数据库锁的实际场景和建议。 ... [详细]
  • http头_http头部注入
    1、http头部注入分析1、原理 ... [详细]
  • mysql自动打开文件_让docker中的mysql启动时自动执行sql文件
    本文提要本文目的不仅仅是创建一个MySQL的镜像,而是在其基础上再实现启动过程中自动导入数据及数据库用户的权限设置,并且在新创建出来的容器里自动启动My ... [详细]
author-avatar
小伊果果_679
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有