首页 > 数据库 >Mysql高级篇(中)——事务篇

Mysql高级篇(中)——事务篇

时间:2024-09-24 22:20:52浏览次数:3  
标签:事务 隔离 -- 高级 READ 提交 Mysql 级别

事务篇

一、数据库事务概述

(1)概念

  • 事务是一组逻辑操作单元,使数据从一种状态变换到另一种状态

(2)事务的处理原则

  • 在一个事务中要么所有的操作都成功执行并最终提交,要么如果其中任何一个操作失败,整个事务会被回滚,保证数据库状态不会受到部分操作的影响。
  • 事务特别适合用于需要保持数据一致性的场景,如:银行转账等需要同时更新多个表的操作。

(3)事务的特性(ACID)

  • 原子性 Atomicity:一个事务不可再分割,要么 都执行 要么 都不执行

  • 一致性 Consistency:一个事务执行会使数据从一个 一致状态 切换到 另外一个一致状态

  • 隔离性 Isolation:一个事务的执行 不受 其他事务的 干扰

  • 持久性 Durability:一个事务一旦提交,则会 永久的改变 数据库的数据.`

在这里插入图片描述

(4)事务的创建

1、隐式事务

  • 事务没有明显开启结束标记,比如insertupdatedelete语句


    关键字autocommit
    关闭set autocommit = false;
  • 默认是开启的,如下图可以通过命令查看;
    开启之后,每一条增改操作都是一个独立的事务

    在这里插入图片描述





2、显式事务

  • 事务具有明显开启结束标记

    前提: 必须 先设置自动提交功能为禁用: set autocommit=0;


步骤1开启事务

set autocommit=0;
start transaction;------------------可选的

步骤2编写事务中的sql语句(select insert update delete)

语句1;
...

步骤3结束事务

commit;---------------------提交事务

rollback;------------------回滚事务

二、如何使用事务

1. 确认使用支持事务的存储引擎

  • MySQL中只有InnoDB等存储引擎支持事务,而MyISAM等不支持。因此,首先确保您的表使用的是InnoDB引擎。
-- 检查表的存储引擎
SHOW TABLE STATUS WHERE Name = 'your_table_name';

-- 如果需要,修改表的存储引擎为InnoDB
ALTER TABLE your_table_name ENGINE=InnoDB;

2. 开始事务

  • 使用 START TRANSACTION、BEGIN 或者 BEGIN 命令开始一个事务。
START TRANSACTION;
-- 或者
BEGIN;

3. 执行数据库操作

  • 在事务块中执行您的SQL语句,如 INSERT、UPDATE、DELETE 等。
INSERT INTO your_table (column1, column2) VALUES (value1, value2);
UPDATE your_table SET column1 = value WHERE condition;
DELETE FROM your_table WHERE condition;

4. 提交或回滚事务

  • 提交事务:如果所有操作都成功,使用 COMMIT 命令提交事务,使更改永久保存。
  • 回滚事务:如果发生错误,使用 ROLLBACK 命令回滚事务,撤销所有未提交的更改。
COMMIT;
或
ROLLBACK;

5. 使用保存点(可选)

  • 使用 SAVEPOINT 创建事务内的保存点,可以部分回滚到某个保存点。
SAVEPOINT savepoint_name;
-- 执行一些操作
ROLLBACK TO SAVEPOINT savepoint_name;
-- 继续其他操作
RELEASE SAVEPOINT savepoint_name;

6. 设置自动提交模式(可选)

  • 默认情况下,MySQLautocommit 是开启的,每个独立的SQL语句都会被自动提交。可以通过以下方式关闭自动提交:

关闭后,必须手动提交或回滚事务。

SET autocommit = 0;

7. 事务隔离级别(可选)

  • 可以设置事务的隔离级别,以控制事务之间的干扰程度。
SET  [GLOBAL|SESSION] TRANSACTION ISOLATION LEVEL '隔离级别';

其中'隔离级别'格式如下
-- READ UNCOMMITTED(读未提交)
-- READ COMMITTED(读已提交)
-- REPEATABLE READ(可重复读)
-- SERIALIZABLE(串行化)
-------------------------------------------------------------
或
-------------------------------------------------------------
SET [GLOBAL|SESSION] TRANSACTION_ISOLATION = '隔离级别';

其中隔离级别格式如下(注意下滑线)
-- READ_UNCOMMITTED(读未提交)
-- READ_COMMITTED(读已提交)
-- REPEATABLE_READ(可重复读)
-- SERIALIZABLE(串行化)

完整示例

START TRANSACTION;

-- 转账操作:从用户A扣款,给用户B加款
UPDATE accounts SET balance = balance - 100 WHERE user_id = 'A';
UPDATE accounts SET balance = balance + 100 WHERE user_id = 'B';

-- 检查余额是否足够,是否有任何错误
SELECT balance FROM accounts WHERE user_id = 'A';

-- 根据条件决定是提交还是回滚
IF (/* 检查条件 */) THEN
    COMMIT;
ELSE
    ROLLBACK;
END IF;

使用事务可以提高数据操作的可靠性,确保数据的一致性。在 MySQL中,事务的使用主要包括开始事务、执行操作、提交或回滚事务。根据业务需求,合理设置事务的隔离级别锁机制,可以有效地管理并发操作。

三、事务隔离级别

(1)分类

事务的隔离级别脏读不可重复读幻读
READ UNCOMMITTED(读未提交)
READ COMMITTED(读已提交)X
REPEATABLE READ(可重复读)XX
SERIALIZABLE(串行化)XXX

在这里插入图片描述

(2)实际生活场景示例理解

在这里插入图片描述

(2)隔离级别的查看和设置

查看隔离级别

SELECT @@transaction_isolation;

SELECT @@GLOBAL.transaction_isolation;------查看全局的隔离级别

在这里插入图片描述

设置隔离级别

① 设置当前MySQL链接的隔离级别

SET SESSION TRANSACTION ISOLATION LEVEL 隔离级别;

  • SESSION 加不加都可以,但是不加的时候,执行后不会马上生效,所以最好加上。

② 设置数据库系统全局或会话的隔离级别

SET GLOBAL TRANSACTION ISOLATION LEVEL 隔离级别;

SET SESSION TRANSACTION ISOLATION LEVEL 隔离级别;


在这里插入图片描述

或者:

SET [GLOBAL|SESSION] TRANSACTION_ISOLATION = 隔离级别;

其中隔离级别格式如下(注意下滑线):

  • READ_UNCOMMITTED(读未提交)
  • READ_COMMITTED(读已提交)
  • REPEATABLE_READ(可重复读)
  • SERIALIZABLE(串行化)

SAVEPOINT 的使用

节点名:设置保存点,要和 ROLLBACK 一起使用才有意义


用法:
在这里插入图片描述

执行上述代码前:
在这里插入图片描述


执行上述代码后:
在这里插入图片描述

示例代码:

# 删除表
DROP TABLE IF EXISTS tab_indentity;
# 创建表时设置标识列
CREATE TABLE IF NOT EXISTS tab_indentity(
id INT PRIMARY KEY  auto_increment,
NAME VARCHAR(20)
);
# 插入数据
INSERT INTO tab_indentity VALUES(66,"tom");
INSERT INTO tab_indentity VALUES(NULL,"jerry");
INSERT INTO tab_indentity VALUES(NULL,"wang");

# SAVEPOINT 节点名:设置保存点,
# 要和 ROLLBACK 一起使用才有意义
set autocommit = 0;
DELETE FROM tab_indentity WHERE id = 68;
SAVEPOINT a;#设置保存点
DELETE FROM tab_indentity WHERE id = 69;
ROLLBACK TO a;


SELECT * FROM tab_indentity; 

四、事务日志

MySQL 的事务日志是确保数据一致性持久性的重要机制,主要用于支持数据库的事务性操作。事务日志能够记录数据库对事务所做的修改,确保在系统故障后能够进行恢复,保持数据完整性。MySQL 中的事务日志体系主要包括以下几种类型:

(1)分类

在这里插入图片描述
在这里插入图片描述

(2)使用

在这里插入图片描述
在这里插入图片描述

标签:事务,隔离,--,高级,READ,提交,Mysql,级别
From: https://blog.csdn.net/weixin_44666786/article/details/142413203

相关文章

  • C# .net 8 used Pomelo.EntityFrameworkCore.MySql
    1.dotnetaddpackagePomelo.EntityFrameworkCore.MySqlusingMicrosoft.EntityFrameworkCore;namespaceConsoleApp84{internalclassProgram{staticvoidMain(string[]args){using(varcontext=newDbBookDataContex......
  • Docker Desktop (WSL)部署MySQL使用Navicat 16 for MySQL远程连接
    DockerDesktop(WSL)部署MySQL使用Navicat16forMySQL远程连接1.docker拉取镜像dockerpullmysql2.查看镜像dockerimages3.启动MySQL实例dockerrun-d-p3307:3306--name=mysql-eMYSQL_ROOT_PASSWORD=123456mysql命令详解参数详解-d在后台运行容......
  • 在windows上使用docker创建mysql数据库
    可以以下步骤在Windows上使用Docker创建MySQL数据库:安装Docker:确保Windows上已安装DockerDesktop。拉取MySQL镜像:打开终端,运行以下命令:dockerpullmysql启动MySQL容器:使用以下命令启动一个MySQL容器(替换your_password为你的密码):dockerrun--namemysql-container......
  • 第二十四讲:MySQL是怎么保证高可用的?
    第二十四讲:MySQL是怎么保证高可用的?简概:依旧是开篇​ 在上一篇文章中,我和你介绍了binlog的基本内容,在一个主备关系中,每个备库接收主库的binlog并执行。正常情况下,只要主库执行更新生成的所有binlog,都可以传到备库并被正确地执行,备库就能达到跟主库一致的状态,这就是最终一......
  • 在用sqoop把数据从mysql导入到hive时如何保持字段类型一致
     在把mysql中的数据导入到hive中时发现更改不了时间,这时可能是mysql的字段类型引起的,观察该表的字段类型(1)也可以事先在hive自己手动创建表,这样创作的表数据类型更加精准,特别是一些精度要求非常高的字段(2)可以在sqoop导入的时候,指定数据类型,sqoop就是指定了数据类型,使用了 ......
  • Docker-compose 启动 mysql 报错 ERROR: for mysql Cannot start service mysql: fai
    报错详情root@hadoop107cmp]#docker-composeconfig-q[root@hadoop107cmp]#ll总用量70192-rw-r--r--.1rootroot718650749月2406:45docker-boot-0.0.1-SNAPSHOT.jar-rw-r--r--.1rootroot10149月2408:26docker-compose.yml-rw-r--r--.1rootro......
  • mysql卸载
    如果你是在Windows系统上,而在服务管理器中看到MySQL服务的条目仍然存在,你可以尝试通过以下步骤手动删除MySQL服务:打开命令提示符(以管理员身份运行):在开始菜单中搜索“命令提示符”,右键单击并选择“以管理员身份运行”。停止MySQL服务:在命令提示符中,运行以下命令来......
  • 【MySQL 04】数据类型
    目录1.数据类型分类2.数值类型 2.1tinyint类型 2.2bit类型2.3float类型  2.4decimal 3.字符串类型3.1char类型3.2varchar类型 4.日期和时间类型 6.enum和set类型6.1.enum和set类型简介:6.2.enum和set的一般使用方法6.3.用数字的方式插入数据6.4.通......
  • MySql distinct 用法
    DISTINCT的主要作用是什么,可以使用groupby或其他方法实现同样的效果吗?DISTINCT的主要作用是在SQL查询中去除结果集中的重复行,确保返回的每个行都是唯一的。它通常用于SELECT语句中,以获取某列或多列的唯一值组合。例如,假设有一个员工表employees,其中有一列department表示......
  • mysql8.4:搭建主从复制(mysql 8.4.1)
    一,主库上:修改配置文件1,配置文件:/etc/my.cnf中,增加:server-id=1说明:无需指明logbin的值,因为它的默认值就是打开的,SHOWVARIABLESLIKE'log_bin';返回:说明:主库的server-id要和从库的server-id区分开,一般主库用1,其他各从库用2及以后的数字二,主库上:创建备份账号1,......