首页 > 数据库 >MySQL系列—13.事务

MySQL系列—13.事务

时间:2024-09-19 22:25:06浏览次数:14  
标签:13 隔离 -- isolation 事务 MySQL 级别 name

1、事务

事务是逻辑上的一组操作,要么都执行,要么都不执行。

事务控制语法

- 事务开始
begin;
- 事务提交,提交后就会写入物理磁盘中去
commit;
- 事务回滚,事务提交后,无法回滚
rollback;

事务的四大特性(ACID)

原子性(atomicity): 事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么完全不起作用

一致性(consistency): 执行事务前后,数据保持一致,例如转账业务中,无论事务是否成功,转账者和收款人的总额应该是不变的;

隔离性(isolation): 并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库是独立的

持久性(durability): 一个事务被提交之后。它对数据库中数据的改变是持久的,即使数据库发生故障也不应该对其有任何影响。

事务自动提交

SET autocommit = 0|1|ON|OFF;

2、并发事务带来的问题

脏读(Dirty Read): 一个事务正在对数据进行修改,在这个事务提交或回滚之前,这些修改对其他事务是可见的。

解决方法: 设置事务隔离级别为READ COMMITTED。

不可重复读(Non-Repeatable Read): 同一个事务在两次查询期间,由于其他事务的修改或删除,导致查询结果不一致。

解决方法: 设置事务隔离级别为REPEATABLE READ。

幻读(Phantom Read): 同一个事务在两次查询期间,由于其他事务的插入操作,导致查询结果集中出现之前不存在的行。

解决方法: 设置事务隔离级别为SERIALIZABLE。

3、数据库的隔离级别

查看隔离级别

- 查看隔离级别,8.0版本之前的,用SELECT @@tx_isolation
select @@transaction_isolation;

- 修改隔离级别
set session transaction isolation level  READ UNCOMMITTED;

读未提交(READ-UNCOMMITTED):

  • 事务可以读取其他事务未提交的数据,这被称为脏读(Dirty Read)。

  • 最低的隔离级别,提供了最少的并发控制。

设置隔离级别为读未提交

- 设置隔离级别
set session transaction isolation level    read uncommitted;
 - 查看隔离级别
select  @@transaction_isolation;

读已提交(read committed oracle默认的隔离级别)

  • 事务只能读取其他事务已经提交的数据,避免了脏读。

  • 但是,在同一个事务中,多次读取同一数据可能会得到不同的结果,这被称为不可重复读(Non-Repeatable Read)。

例:事务 A 读取了数据,然后事务 B 修改了该数据并提交。事务 A 再次读取该数据时,得到了不同的结果,这就是不可重复读。

-- 事务 A
START TRANSACTION;
SELECT * FROM table_name; -- 第一次读取
-- 其他操作
SELECT * FROM table_name; -- 第二次读取,可能得到不同的结果
COMMIT;

-- 事务 B
START TRANSACTION;
UPDATE table_name SET column_name = value WHERE condition;
COMMIT;

设置隔离级别为读已提交

- 设置隔离级别
set session transaction isolation level    read committed;
  - 查看隔离级别
select  @@transaction_isolation;

可重复读(repeatable read mysql 的默认隔离级别)

  • 在同一个事务中,多次读取同一数据时,结果是一致的,避免了不可重复读。

  • 但是,可能会出现幻读(Phantom Read)。幻读是指在一个事务中,两次查询返回的行数不同,这是因为其他事务插入或删除了数据。

  • mysql> select @@transaction_isolation;
    +-------------------------+
    | @@transaction_isolation |
    +-------------------------+
    | READ-UNCOMMITTED        |
    +-------------------------+

例:事务 A 读取了一些数据,然后事务 B 插入了一些新的数据。事务 A 再次查询时,发现多了一些数据,这就是幻读。

-- 事务 A
START TRANSACTION;
SELECT * FROM table_name WHERE condition; -- 第一次查询
-- 其他操作
SELECT * FROM table_name WHERE condition; -- 第二次查询,可能出现幻读
COMMIT;

-- 事务 B
START TRANSACTION;
INSERT INTO table_name VALUES (...);
COMMIT;

串行化(Serializable)

  • 最高的隔离级别,提供了最强的并发控制。

  • 事务之间是完全隔离的,一个事务必须等待另一个事务完成后才能执行。

  • 避免了脏读、不可重复读和幻读。

例:事务 A 和事务 B 同时尝试对同一数据进行操作,事务 B 必须等待事务 A 完成后才能执行

-- 事务 A
START TRANSACTION;
SELECT * FROM table_name WHERE condition FOR UPDATE; -- 锁定数据
-- 其他操作
COMMIT;

-- 事务 B
START TRANSACTION;
SELECT * FROM table_name WHERE condition FOR UPDATE; -- 等待事务 A 完成
-- 其他操作
COMMIT;

4、如何选择隔离级别

    并发程度:如果系统需要高并发,那么可以选择较低的隔离级别,以提高并发性能。但是,这可能会导致数据的不一致性。

    数据一致性要求:如果系统对数据一致性要求很高,那么应该选择较高的隔离级别,以确保数据的正确性。

    性能要求:较高的隔离级别通常会导致性能下降,因为需要更多的锁和同步机制。

        在实际应用中,可以根据具体情况选择合适的隔离级别。一般来说,读已提交是比较常用的隔离级别,它可以避免脏读,同时提供了较好的并发性能。如果对数据一致性要求非常高,可以选择可重复读或串行化。

标签:13,隔离,--,isolation,事务,MySQL,级别,name
From: https://blog.csdn.net/md54333/article/details/142332432

相关文章

  • 每日分享之-MySQL单表
    1.什么是数据库?数据库:DataBase(DB),是存储和管理数据的仓库,本质就是一个存放数据的文件系统数据库会按照特定的格式对数据进行存储,用户可以对数据库中的数据进行增加,修改,删除及查询操作数据库管理系统:DataBaseManagementSystem (DBMS),操纵和管理数据库的大型软件。数据......
  • 6. 什么是MySQL的事务?如何在Java中使用Connection接口管理事务?
    事务(Transaction)是一组可以看作一个逻辑单元的操作,这组操作要么全部成功,要么全部失败。事务确保了数据库操作的原子性、一致性、隔离性和持久性,这些性质统称为ACID特性:原子性(Atomicity):事务中的所有操作要么全部完成,要么全部不完成,不会出现部分完成的情况。如果事务中某个......
  • 7. 在Java中集合mysql如何执行一条简单的SELECT查询,并获取结果集?
    在Java中,使用JDBC(JavaDatabaseConnectivity)可以执行SQL查询,并获取结果集(ResultSet)。以下是执行一条简单的SELECT查询,并获取和处理结果集的详细步骤:1.导入必要的包首先,确保导入了必要的JDBC包。你需要导入以下包来进行数据库连接和操作:importjava.sql.Connection;imp......
  • 脏读!幻读!不可重复读!mysql并发事务引发的问题
    脏读!幻读!不可重复读!mysql并发事务引发的问题并发事务引发的三个问题①脏读脏读(DirtyRead)是数据库事务隔离级别中的一种现象。它发生在两个事务并发执行时,一个事务能够读取到另一个事务尚未提交的修改。脏读的具体情况事务A对某个数据进行了修改,但尚未提交。事务B在事务......
  • 代码随想录刷题day13 | LeetCode 110.平衡二叉树 257. 二叉树的所有路径 404.左叶子之
    110.平衡二叉树力扣题目链接后序遍历求高度,高度判断是否平衡|LeetCode:110.平衡二叉树1.三元运算符:(?:)condition?expression_if_true:expression_if_false;前面是条件,如果符合就等于冒号前的expression_if_true,反之则是后面的。2.如果要使用if(!node->left),要......
  • mysql容器使用
    一、镜像使用的部分介绍创建一个简单的mysql容器dockerrun--namesome-mysql-eMYSQL_ROOT_PASSWORD=my-secret-pw-dmysql:tag宿主机没有安装msql的情况下,可以通过docker命令连接mysql通过容器连接远程mysqldockerrun-it--rmmysqlmysql-hsome.mysql.host-usom......
  • MySQL之事务
    事务的简介:事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。例如生活中的转账事务的操作:方式一:关闭自动提交模式使用步骤:关闭自动提交模式:set@@autocommit=0;执行......
  • cover MySQL三部曲备份【逻辑备份+物理备份】脚本,生产实践
    前言:逻辑备份[mysqldump]物理备份[Xtrbackup]1、mysqldump全备建议手动制定库,不要选择–all,容易在数据恢复时发生问题–set-gtid-purged=OFF选项,在备份时会记录binlog日志,如果不加,不记录binlog日志,所以在我们做主从用了gtid时,用mysqldump备份时就要加–set-gtid-pur......
  • FIT5137  MStay account Transformation Stage
    FIT5137Assignment2-S22024 (Weight=40%)Due-Friday,20September2024,4:30PMGeneralInformationandSubmissiono Thisisanindividualassignment.o Submissionmethod:SubmissionisonlinethroughMoodle.o Penaltyforlatesubmission:5%deduc......
  • 基于SpringBoot+Vue+MySQL的智能物流管理系统
    系统展示系统背景  随着信息技术的飞速发展和电子商务的蓬勃兴起,智能物流管理系统的需求日益迫切。传统的物流管理方式已难以满足高效、精准、实时的管理需求。因此,基于SpringBoot、Vue和MySQL的智能物流管理系统应运而生。该系统旨在通过现代化的技术手段,实现物......