当前位置: 首页 > 科技观察

MySQL事务,这篇文章就够了

时间:2023-03-15 15:25:52 科技观察

0什么是事务事务(Transaction)是并发控制的基本单位。所谓事务,它是一个操作序列,这些操作要么执行要么不执行,它是一个不可分割的工作单元。事务是数据库维护数据一致性的单位,可以在每个事务结束时维护数据一致性。同时事务有严格的定义,必须满足四个特性,也就是我们一直说的ACID。但是,并不是说所有类型的数据库都必须满足这四个特性。对于不同的数据库实现,不同的程度不一定完全满足要求。例如,对于Oracle数据库,默认的事务隔离级别是READCOMMITTED,不满足隔离要求。下面我们就趁热打铁,介绍一下必须知道和理解的四大商业特征。这些特征也在访谈中。面试官在面试MySQL相关知识的时候,问的问题比较多。因此,这些特点必须要了解清楚,牢记在心。开玩笑,就算被火车撞了,也不能忘记这四个特征!1事务的四大特性事务的四大特性简称为:ACID,即原子性、一致性、隔离性和持久性。让我们一一介绍。原子性(Atomicity)原子性是指整个数据库的事务是一个不可分割的工作单元,每个工作单元都应该是一个原子操作。当我们执行一个事务时,如果一系列操作中有一个操作失败了,那么我们需要将这个事务中的所有操作都恢复到执行该事务之前的状态,这就是事务的原子性。这是一个简单的例子。我++;上面最简单的代码经常被问到,这是原子操作吗?绝对不是这样。如果我们把这段代码放到一个事务中,当i+1出现问题时,整个代码i++(i=i+1)就会回滚,所以回滚之后,i的值也不会改变。以上就是原子性的概念。一致性(consistency)一致性是指一个事务将数据库从一个状态改变为下一个一致的状态,也就是说事务执行前后,这两个状态应该是相同的,即完整性约束数据库不会被破坏。另外需要注意的是,一致性不关注中间状态。比如在银行转账的过程中,你把钱转给他人。至于中级状态,你少500,他多500。转账的中间状态也是不可见的,只有最后的成功或失败状态是可见的。谈到分布式一致性,可以分为强一致性、弱一致性和最终一致性。自己检查这些概念是很有趣的。隔离(isolation)事务我们可以启动很多事务。MySQL数据库中可以同时启动多个事务。但是,它们是相互隔离的,即互不影响。这就是事务的隔离。持久性(durability)事务的持久性是指事务一旦提交,就是永久的。即使出现问题,也可以恢复数据库。因此,持久性保证了交易的高可靠性。2事务的分类事务可以分为很多种,一般分为:平面事务、带保存点的平面事务、链式事务、嵌套事务、分布式事务。平面事务平面事务是最简单的一种,也是实际开发中使用最多的事务。在这种事务中,所有的操作都在同一层,最常见的方式如下:平面事务的主要缺点是不能提交或回滚事务的某一部分,或者分几个独立的步骤提交。带保存点的扁平事务除了支持扁平事务支持的操作外,这种事务与扁平事务最大的区别在于它们允许在事务执行过程中回滚到同一事务中较早的状态,因为在执行过程中可能发生的错误某些交易的执行可能并非对所有操作都无效。放弃整个事务不符合要求,开销太大。保存点用于通知系统应该记住事务的当前状态,以便将来发生错误时,事务可以返回到该状态。例如beginwork;select*fromuser;savepointt1;updateusersetname='sihai'whereid=1;savepointt2;commitwork;通过上面的方法,我们建立了两个保存点t1和t2,通过ROLLBACKTOSAVEPOINTt1,我们可以回到保存点t1。ChaintransactionChaintransaction:当一个事务被提交时,释放掉不需要的数据对象,并将必要的处理上下文隐式传递给下一个要启动的事务。需要注意的是commit事务操作和next事务操作会合并成一个原子操作,即下一个事务可以看到上一个事务的结果。链式事务意味着回滚时,只能恢复到最新的保存点;而带有保存点的平面事务可以回滚到任何正确的保存点。例如beginwork;select*fromuser;savepointt1;updateusersetname='sihai'whereid=1;savepointt2;commitwork;还是同一个例子,但是对于链式交易,不能直接回滚到保存点t1,可以恢复到最近的A保存点t2;另外需要注意的是,链式事务在执行commit后会释放当前事务持有的所有锁,而带有savepoint的flat事务不会影响持有的锁。嵌套事务在事务中嵌套事务。这种结构有点像水平树结构。根节点的交易称为顶级交易。事务的前身称为父事务,其他事务称为子事务。事务的前一层称为父事务,事务的下一层称为子事务。一个子事务可以提交也可以回滚,但是它的提交操作不会立即生效,除非它被它的父事务提交。因此,可以确定在顶层事务提交之后,任何子事务才真正被提交。同样,任何事务的回滚都会导致其所有子事务一起回滚。BEGINWORKSubTransaction1:BEGINWORKSubOperationXCOMMITWORKSubTransaction2:BEGINWORKSubOperationYCOMMITWORK...SubTransactionN:BEGINWORKSubOperationNCOMMITWORKCOMMITWORK分布式事务分布式事务通常是指运行在分布式环境中的平面事务,因此需要根据数据所在的位置访问网络中的不同节点。在不同的物理地址,通过网络访问,执行不同的交易,这就是分布式交易。3事务的使用这部分首先介绍一下这些事务的语句。数量不多,使用也不复杂。让我们用一个表格来组织它们。注意:COMMIT和COMMITWORK语句的区别在于,COMMITWORK用于控制事务结束后的行为是CHAIN还是RELEASE。如果是CHAIN,那么这笔交易就是链上交易。用户可以通过参数completion_type对其进行控制,如下:completion_type=1实例执行以下操作;SET@@completion_type=1;BEGINWORK;INSERTINTOlock_testSELECT10;COMMITWORK;然后我们进行以下操作;INSERTINTOlock_testSELECT115;ROLLBACK;SELECT*FROMlock_test;我们先插入一条数据115,然后回滚,我们知道如果不在事务中,115应该插入成功,即使我们回滚,但是这里,我们之后rollback,查询结果如下:此时没有115这条记录,也就是rollback生效了,意思是COMMITWORK之后,是一个新的事务,所以会出现这个结果。completion_type=2实例,我们首先进行以??下操作;SET@@completion_type=2;BEGINWORK;INSERTINTOlock_testSELECT5;COMMITWORK;上面我们已经提交了事务,当我们使用下面的语句查询lock_test的数据时,会出现断线的情况。选择*FROMlock_test;4事务隔离级别事务隔离级别有四种:READUNCOMMITTEDREADCOMMITTEDREPEATABLEREADSERIALIZABLE关于这些隔离级别的问题和总结,可以查看这篇文章:又一MySQL神器——锁,MySQL面试必备5小结本文介绍MySQL数据库事务的内容来自以下内容,其他更详细的内容将在后面的文章中进行讲解。概念事务类型事务使用事务隔离级别这篇文章有问题,请指正。喜欢微信阅读的也可以关注我的微信公众号:学好java,获取优质学习资源。