什么是事务?
事务的分类
MySQL的InnoDB存储引擎支持扁平事务、带有保存点的事务、链事务、分布式事务。
扁平事务应用最为广泛,实现最为简单,扁平事务的所有操作都是在同一个层级,这些操作要么全部成功,要么全部回滚,不能存在部分提交或者部分回滚的的场景。
扁平事务
扁平事务的限制就在于不能部分回滚或者提交,而有的场景是这么做是代价非常大的。比如我们举个例子:
我们玩生存类游戏,如果我们意外失败就必须从出生地开始玩,那么这会是让人崩溃的,我们希望有一个游戏存档,如果游戏失败我们可以从最近的一个存档重新加载游戏。
带保存点的扁平事务就是,除了支持扁平事务的操作外,允许事务执行过程中 回滚到该事务较早的一个状态 ,而这个较早的状态就是保存点来记录的。
带保存点的扁平事务
链事务是一种保存点事务的变种,两者的最大区别是,带保存点的事务可以回滚到较早前的任意保存点,而链式事务只能回滚到最近一个保存点;带保存点的事务因为需要回滚到任意保存点,固其事务执行期间所占用的资源是不会被释放的,而链事务则在执行完成当前节点后会释放掉不需要的资源,并将下一个节点需要的资源隐士传递下去。链事务可以参考Flink流式计算的Checkpoint机制,两者非常的相似。
链事务
嵌套事务顾名思义,事务结构看上去就像一棵树,根节点就是一个顶层事务,所有的叶子节点都是扁平事务(也就是说叶子节点才是真正干活儿的),事务的嵌套层级不受限制。子事务可以提交也可以回滚,但是其提交不会立即生效,只有在顶层事务提交之后所有子事务才会被真正的提交。
嵌套事务
分布式事务是指一个在分布式环境下运行的扁平事务,在本章中主要介绍本地事务,分布式事务我会在后续章节是介绍。
事务的ACID特性
事务如何实现
事务的原子性、一致性、持久性通过redo log与undo log来完成,事务的隔离性由锁与MVCC来完成。
Redo log(重做日志)

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
发表评论