MySQL事务详解 (mysql事务)

教程大全 2025-07-17 19:40:45 浏览

什么是事务?

事务的分类

MySQL的InnoDB存储引擎支持扁平事务、带有保存点的事务、链事务、分布式事务。

扁平事务应用最为广泛,实现最为简单,扁平事务的所有操作都是在同一个层级,这些操作要么全部成功,要么全部回滚,不能存在部分提交或者部分回滚的的场景。

扁平事务

扁平事务的限制就在于不能部分回滚或者提交,而有的场景是这么做是代价非常大的。比如我们举个例子:

我们玩生存类游戏,如果我们意外失败就必须从出生地开始玩,那么这会是让人崩溃的,我们希望有一个游戏存档,如果游戏失败我们可以从最近的一个存档重新加载游戏。

带保存点的扁平事务就是,除了支持扁平事务的操作外,允许事务执行过程中 回滚到该事务较早的一个状态 ,而这个较早的状态就是保存点来记录的。

带保存点的扁平事务

链事务是一种保存点事务的变种,两者的最大区别是,带保存点的事务可以回滚到较早前的任意保存点,而链式事务只能回滚到最近一个保存点;带保存点的事务因为需要回滚到任意保存点,固其事务执行期间所占用的资源是不会被释放的,而链事务则在执行完成当前节点后会释放掉不需要的资源,并将下一个节点需要的资源隐士传递下去。链事务可以参考Flink流式计算的Checkpoint机制,两者非常的相似。

链事务

嵌套事务顾名思义,事务结构看上去就像一棵树,根节点就是一个顶层事务,所有的叶子节点都是扁平事务(也就是说叶子节点才是真正干活儿的),事务的嵌套层级不受限制。子事务可以提交也可以回滚,但是其提交不会立即生效,只有在顶层事务提交之后所有子事务才会被真正的提交。

嵌套事务

分布式事务是指一个在分布式环境下运行的扁平事务,在本章中主要介绍本地事务,分布式事务我会在后续章节是介绍。

事务的ACID特性

事务如何实现

事务的原子性、一致性、持久性通过redo log与undo log来完成,事务的隔离性由锁与MVCC来完成。

Redo log(重做日志)

MySQL事务详解

Redo log是用来实现事务的持久性,为了更好的读写性能,InnoDB会将数据缓存在内存中,对磁盘数据的修改也会落后于内存,如果进程或系统崩溃,则数据面临丢失的风险,这时重做日志就起到了保证数据的一致性与持久性作用。重做日志主要记录了以页为单位的数据修改信息,其结构如下:

redo log 结构

Undo log(回滚日志)

重做日志记录了事务的行为,可以在需要的时候对页进行“重做”,但是事务有时是需要被回滚的,当语句执行失败或者用户请求回滚,就可以通过undo log将数据回滚到修改前的样子,undo log是存储了行记录的变更。其主要包含两类undo log:

两种undo log结构

下面是一个事务与undo log的关系结构:

事务与undo log关系结构

事务隔离

事务在并发场景下很难保证事务的隔离性一致性,主要有以下一些事务的并发一致性问题。

事务并发问题

事务隔离级别

事务隔离级别是MySQL对ACID的实现程度上的分级,分为了四个等级,等级越高数据库越安全,每种隔离级别解决了不同事务并发一致性的问题,具体如下:

关于事务隔离的实现会在后续文章详细讲解,本文不在展开。

事务的执行过程

事务的执行过程

binlog的开启时会存在一个内部XA的问题(binlog是在MySQL层,而redo log在存储引擎层),这里引入了2PC(二阶段提交):


mysql 和innodb的区别

MySQL数据库有多种存储引擎:比如:MyISAM、InnoDB、MERGE、MEMORY(HEAP)、BDB(BerkeleyDB)、EXAMPLE、FEDERATED、ARCHIVE、CSV、BlackHOLE等等,最常见的也就是MyISAM和InnoDB了,下面主要讲解下MyISAM和InnoDB两种mysql数据库存储引擎的区别。 MyISAM引擎是一种非事务性的引擎,提供高速存储和检索,以及全文搜索能力,适合数据仓库等查询频繁的应用。 MyISAM中,一个table实际保存为三个文件,存储表定义,存储数据,存储索引。 MyISAM在所有MySQL配置里被支持,它是默认的存储引擎,除非你配置MySQL默认使用另外一个引擎。 MySQL服务器中的其他非事务性存储引擎(如MyISAM)遵从不同的数据完整性范例,称之为“原子操作”。 按照事务术语,MyISAM表总能高效地工作在AUTOCOMMIT=1模式下。 原子操作通常能提供可比较的完整性以及更好的性能。 与经过优化调整的最快的事务性表相比,它的速度快3~5倍。 由于MySQL服务器支持两种范例,因而你能决定是否利用原子操作的速度更好地服务于你的应用程序,或使用事务特性。 该选择可按表进行。 InnoDB则是一种支持事务的引擎。 给MySQL提供了具有提交,回滚和崩溃恢复能力的事务安全(ACID兼容)存储引擎。 所以的数据存储在一个或者多个数据文件中,支持类似于Oracle的锁机制。 一般在OLTP应用中使用较广泛。 如果没有指定InnoDB配置选项,MySQL将在MySQL数据目录下创建一个名为ibdata1的自动扩展数据文件,以及两个名为ib_logfile0和ib_logfile1的日志文件。 InnoDB锁定在行级并且也在SELECT语句提供一个Oracle风格一致的非锁定读。 这些特色增加了多用户部署和性能。 没有在InnoDB中扩大锁定的需要,因为在InnoDB中行级锁定适合非常小的空间。 InnoDB也支持FOREIGN KEY强制。 在SQL查询中,你可以自由地将InnoDB类型的表与其它MySQL的表的类型混合起来,甚至在同一个查询中也可以混合。 InnoDB是为处理巨大数据量时的最大性能设计。 它的CPU效率可能是任何其它基于磁盘的关系数据库引擎所不能匹敌的。 InnoDB存储引擎被完全与MySQL服务器整合,InnoDB存储引擎为在主内存中缓存数据和索引而维持它自己的缓冲池。 InnoDB存储它的表&索引在一个表空间中,表空间可以包含数个文件。 InnoDB表可以是任何尺寸,即使在文件尺寸被限制为2GB的操作系统上。 InnoDB也默认被包括在所有MySQL 5.1二进制分发版里。

sql视图 存储过程 触发器各自的优点是什么?

视图的优点:提高数据安全性,可以不让用户看到表中的某个字段。 比如password,你只给他们执行视图的权限,不给执行表的权限,他们就无法查看全部数据。 还有可以建立一个视图,内容包括两个表,更新的时候只需要指定ID,而不用管它来自哪个表,对应表中的数据就会自动更新。 存储过程的优点:包括视图的所有优点,还可以让不懂数据库的人也能也用数据库,还有就是方便程序计设,比如我负责前台程序设计,你负责写存程,我不用管你是怎么写,最后只接调用,我们分工明确,我也不需要懂你所懂的,这为用不懂语言和不同专业的人在一起合作提供了良好的平台。 提高开发效率。 触发器的优点:保证数据的正确性和逻辑,比如订单表中新增一条数据,对应在库存表中会减少一个产品一样。 还有保证数据的安全性,比如当用户删除表A,我们可以判断他是否为Admin组的用户,如果不是,就会给出错误的提示,并将事务回滚。 我知道的就这么多了。 。 。 嘿嘿。

PL/SQL中的EXECUTE IMMEDIATE疑问

in 表示输入参数 out 表示输出参数也就是说execute immediate begin || l_routin || (:2, :3, :4); end; using in l_tblnam, out l_cnt, in out l_status;dbms__line(l_cnt);可以打印出过程执行后的返回结果 l_cnt

本文版权声明本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请联系本站客服,一经查实,本站将立刻删除。

发表评论

热门推荐