mysql (事物)

一.什么是事物

 事物是一组操作的集合,不可分割的工作单位,事物会把所有的操作当作一个整体一起向系统提交或撤销操作请求,就是这些操作要么一起成功要么一起失败。

二.事物操作 (这个就是一个理解)

 1.事务特性
 原子性Atomicity:指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。

一致性Consistency:事务必须使数据库从一个一致性状态变换到另外一个一致性状态。例如:转账前和转账后的总金额不变。

隔离性Isolation:事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务执行时,不能被其他事务的执行所干扰,多个并发执行的事务之间要相互隔离。(通过事务的隔离级别保证隔离性)

持久性Durability:指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响

2.事物的隔离级别会产生的问题

脏读:读取其他事物未提交的数据 

不可重复度:读取其他事物已经提交修改

幻读:读取其他事务插入的操作

下面有具体设置隔离级别的案例

扩展:这个说的是原子性和隔离性没有关系

通过以下命令查看MySQL事物的提交方式

select @@autocommit

1是自动提交  0是手动提交

mysql中的事物默认自动提交。

可以将mysql中的事物设置为手动提交。

  2.1查看/设置事物的提交方式

       创建表并插入数据

       CREATE TABLE `test_01` (
       `id` int DEFAULT NULL COMMENT '主见id',
       `name` varchar(10) DEFAULT NULL COMMENT '姓名',
       `money` int DEFAULT NULL COMMENT '金额'
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci             COMMENT='测试表';

         INSERT INTO test_01 (id,name,money) 
         VALUES (1,'张三',2000), (2,'李四',2000);

  2.2提交事务

  2.3回滚事物

三.脏读,幻读,不可重复读

  脏读过程的理解(切换事物的隔离级别,不同的隔离级别会导致数据的脏读,幻读,不可重复读)

 第一个窗口中查询的数据

 第二个窗口中查询的数据

第一个窗口中开启事物

第二个窗口中开启事物

第一个窗口中开启事物后的查询

第二个窗口中开启事物后的修改并查询

第一个窗口在开启事物后,查询第二个窗口在开启事物并修改数据后的查询

第二个窗口提交事物并查询

第一个窗口在第二个窗口提交事物后,第一个窗口没有提交事物的查询

第一个窗口在提交事物后的查询

总结:在没有关闭inndb自动提交事物和关闭inndb自动提交事物的情况下,都没有发生脏读的情况,都是在各自的窗口中执行各自的操作,另一个窗口的操作并不会对其他窗口有影响。就算是操作(修改,删除,插入)后提交了事物,也不会对其他事物还在进行中的数据有影响。大招(因为我们默认用的隔离级别是 可重复读 (Repeatable read 可重复读) 不会发生 脏读,幻读,不可重复读)

这条查询会返回全局和会话级别的事务隔离级别。全局级别代表服务器级别的默认隔离级别,而会话级别代表当前连接会话的隔离级别。

执行这条查询将返回类似以下的输出:

 SELECT @@GLOBAL.transaction_isolation, @@SESSION.transaction_isolation;

mysql8设置隔离级别

在MySQL 8中,您可以使用SET TRANSACTION语句来设置事务的隔离级别。以下是几个常见的隔离级别设置示例:

1.设置为读未提交(Read Uncommitted):

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

2.设置为读已提交(Read Committed):

SET TRANSACTION ISOLATION LEVEL READ COMMITTED;

3.设置为可重复读(Repeatable Read):

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;

4.设置为串行化(Serializable):

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

请注意,设置隔离级别必须在启动事务(使用START TRANSACTION)之前进行。一旦事务开始,隔离级别就无法更改。

此外,也可以在MySQL配置文件(通常是my.cnfmy.ini)中设置默认的全局隔离级别,或者为单个会话设置隔离级别。这样做可以影响所有新的连接和事务,不必在每次开始事务时都进行设置。

四.隔离级别的具体实现

参考视频:MySQL事务和锁机制详解_哔哩哔哩_bilibili

事物具体的实现方式

原子性,一致性,持久性 通过redo log 和 undo log 实现

隔离性 通过锁和mvcc(多版本控制)实现

就到这,重新写一篇具体的实现

相关推荐

  1. Mysql 事物阻塞

    2024-06-12 23:48:02       43 阅读
  2. Mysql事务

    2024-06-12 23:48:02       79 阅读
  3. MySQL 事务

    2024-06-12 23:48:02       58 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-12 23:48:02       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-12 23:48:02       106 阅读
  3. 在Django里面运行非项目文件

    2024-06-12 23:48:02       87 阅读
  4. Python语言-面向对象

    2024-06-12 23:48:02       96 阅读

热门阅读

  1. 51单片机实现流水灯

    2024-06-12 23:48:02       28 阅读
  2. 第二章.数字相关类

    2024-06-12 23:48:02       31 阅读
  3. Linux内核 -- ftrace 调试工具培训

    2024-06-12 23:48:02       33 阅读
  4. 第一章 - 第1节-计算机概述 - 课后习题

    2024-06-12 23:48:02       30 阅读
  5. CSS Display(显示)

    2024-06-12 23:48:02       27 阅读
  6. 新建pdb 打不开 ORA-65104 ORA-25153

    2024-06-12 23:48:02       28 阅读
  7. 哲学家进餐问题

    2024-06-12 23:48:02       31 阅读
  8. ARM 汇编 C语言 for循环

    2024-06-12 23:48:02       26 阅读
  9. day7C++

    2024-06-12 23:48:02       22 阅读
  10. 解封装类的实现【3】

    2024-06-12 23:48:02       28 阅读
  11. <题海拾贝>[递归]2.合并两个有序链表

    2024-06-12 23:48:02       31 阅读