欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 新车 > mysql (事物)

mysql (事物)

2024/10/23 23:20:26 来源:https://blog.csdn.net/xiweihao/article/details/139535223  浏览:    关键词: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(多版本控制)实现

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

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com