Mysql系列--9、事务 - 教程

目录

一、什么是事务?

        1.1概念

        1.2属性

二、为什么要有事务?

三、事务的提交和操作

        3.1事务的提交

                3.1.1类型

                3.1.2操作

        3.2事务相关操作

                3.2.1启动事务

                3.2.2事务回滚

                3.2.3事务异常

                3.2.4单sql与事务的关系

四、事务的隔离性和隔离级别

        4.1隔离级别(脏读,不可重复读,幻读)

        4.2隔离级别的实现

        4.3相关操作

        4.4总结


本文所有多事务的模拟测试均有两个本地mysql客户端实现

一、什么是事务?

        1.1概念

        事务是一组DML语句组成,本质为多个sql语句组合成一个集合,这些语句逻辑上相关,执行时要么全部成功要么全部失败,是一个整体。

        事务主要用来处理操作量大,复杂度高的数据

        mysql中仅Innode存储引擎支持,Myisam等不支持

        1.2属性

        一个Mysql数据库不止一个事务在运行,同一时刻可能会用大量的请求被包装成事务向服务器发起处理请求,而每条事务至少一条 SQL ,最多很多 SQL ,这样如果大家都访问同样的表数据,在不加保护的情况,就绝对会出现问题。甚至,因为事务由多条 SQL 构成,那么,也会存在执行到一半出错或者不想再执行的情况,那么已经执行的怎么办呢

        因此一个安全完整的事务除了sql集合还要满足以下四个属性:

(1)原子性

一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。

        (2)一致性

在事务开始之前和事务结束以后,数据库的完整性没有被破坏。对数据库的操作符合用户的预设结果

        (3)隔离性

数据库允许多个并发事务同时对其数据进行读写和修改的能力

        (4)持久性

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

二、为什么要有事务?

        为了当应用程序访问数据库时,可以简化使用者的编程模型,不必考虑潜在错误和并发问题,主要为了方便用户的操作

为了应用层服务的,而不是数据库天生就用

三、事务的提交和操作

        3.1事务的提交

                3.1.1类型

事务的提交方式有两种:自动与手动

                3.1.2操作
1.查看事务的提交方式
show variables like 'autocommit';

2.改变提交方式
set autocommit = 0 / 1;
0->手动
1->自动

        3.2事务相关操作

                3.2.1启动事务
1.begin
2.start transaction
事务启动后,所有的sql属于同一事务,commit用来结束该事务

                3.2.2事务回滚

        当事务执行到一半发生异常或者不想执行时,数据库会利用回滚操作来保证数据库的一致性与安全。

1、回滚到指定步骤
(1)设置保存点
savepoint 保存点名;
(2)回滚到指定保存点
rollback to 指定保存点名;
2、直接回滚到事务初始状态
rollback;

两事务的初始状态:

                3.2.3事务异常

当事务异常会自动回滚到操作以前

                3.2.4单sql与事务的关系

一句单sql语句本身会被封装成事务,因为mysql有自动提交!

四、事务的隔离性和隔离级别

        前文我们提到Mysql服务一般都是多请求访问,每个请求都有自己的事务需要执行,为了保证每个事务间不相互影响,干扰,Mysql出现了隔离性的概念,而数据库为了不同的干扰程度又提出了隔离级别的说法。

        4.1隔离级别(脏读,不可重复读,幻读)

(1)读未提交 read ucommited

        一个事务可以在在执行过程中读到另一事务的未commited的操作,但这种隔离级别强烈不安全,我们称作脏读问题。

(2)读提交  read commited

一个事务commited后被另一个事务读取到。

这种会造成在同样条件下一事务读取到的数据再次读取出来发现值不一样,我们称作不可重复读问题,主要发生在对表的修改删除方面

        该隔离级别是大多数数据库采取的默认隔离级别

(3)可重复读  repeatable read

它确保同一个事务,在执行中,多次读取操作数据时,会看到同样的数据行

        但一旦发生新增操作,在同样的条件下第一次与第二次读出来记录数不同,我们称作幻读问题

因为隔离性实现是对数据加锁完成的,而insert待插入的数据因为并不存在,那么一般加锁无法屏蔽这类问题),会造成虽然大部分内容是可重复读的,但是insert的数据在可重复读 情况被读取出来,导致多次查找时,会多查找出来新的记录,就如同产生了幻觉

(4)串行化  serializable

这是事务的最高隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决了幻读的问题。它在每个读的数据行上面加上共享锁,。但是可能会导致超时和锁竞争

(这种隔离级别太极端,实际生产基本不使用

        4.2隔离级别的实现

        隔离,基本都是通过锁实现的,不同的隔离级别,锁的使用是不同的。常见有,表
锁,行锁,读锁,写锁,间隙锁(GAP),Next-Key(GAP+行锁)等。

        4.3相关操作

查看隔离级别
select @@global.tx_isolation;--全局
select @@session.tx_isolation; --当前会话
设置隔离级别
set [session/global] transaction isolation level 隔离级别英文;
设置隔离级别会话只会影响当前会话,全局需要重启会影响全部

        4.4总结

posted @ 2025-09-25 09:26  wzzkaifa  阅读(8)  评论(0)    收藏  举报