读书百遍其义自现。
MySQL数据库在我们平时工作学习中的使用频率是相当之高,彻底掌握MySQL的事务机制对我们平时工作会有非常大的帮助,仔细回忆一下,你是否对MySQL事务相关的知识是否完全掌握?是否感觉有的地方有些模糊?通过这篇文章让你彻底理顺逻辑,下面就开始吧!
01事务的特性事务的特点
提到数据库的事务,我们肯定脱口而出的就是ACID,但是有的时候并不清楚ACID到底是什么,掌握事务的特性对于我们接下来学习是相当重要的。
首先举个例子,老王去银行转账的例子将农业银行的100元转到老刘农业银行卡,主要有以下三步
1.首先判断老王的农业银行的账户金额是否大于100元
2.老王的农业银行的账户余额减去100元
3.老刘的农业银行的账户余额加100元
试想一下如果其中某一步失败就会导致非常严重的问题,我们需要把操作放到一个事务中去执行,如果其中有一步执行失败,那么所有操作都将回滚,通过这种方式来保证数据一致性。
start transaction;select balance from account where uid = 60610;update account set balance = balance - 100 where uid = 60610;update account set balance = balance + 100 where uid = 60611;commit;
原子性(atomicity)
原子在化学中表示不可再进行分割的基本微粒,在事务表示的是这是一个不能再被分割的最小工作单元,整个事务的所有操作,要么全部成功,要么全部失败回滚,而不可能仅仅执行某一部分。
一致性(consistency)
数据库总是从一个一致性的状态转化到另一个一致性的状态,老王转账即使第二步和第三步之间系统崩溃了,也不会出现问题,因为数据并没有提交,没有提交事务,所做的修改也并不会保存到数据库中。
隔离性(isolation)
通常来说,一个事务所做的修改在最终提交前,对其他的事务是不可见的,这里为什么说“通常是不可见的”,因为这和具体的事务隔离级别有关,后面我们会进行分析。
持久性(durability)
一旦事务提交,则其他的修改就会永远保存到数据库中。即使系统崩溃,修改的数据也不会丢失。
02事务隔离级别事务隔离级别
所谓事务隔离级别,就是用来定义一个事务所做的修改,哪些在事务内和事务间是可见的,哪些是不可见的。较低级别的隔离通常可以执行更高的并发,系统开销也更低 。
在MySQL中一共有四种事务隔离级别:读未提交、读提交、可重复读、可串行化,下面我们将分别简单介绍四种隔离级别。
读未提交 read uncommitted
在此事务隔离级别下,修改数据库中的数据,即使没有提交,对其他事务也是可见的。事务可以读到未被提交的数据,这种情况也被称为脏读,这种隔离级别下会出现很多问题,但性能也不会比read committed好太多。
读提交 read committed
大多的数据库的默认事务隔离都是读提交,但是MySQL的默认事务隔离基本是可重复读,在这种隔离级别下,只有当事务提交后,事务中的修改才会对其他事务可见,但是会出现在同一个事务中多次查询数据结果可能不同,因为中间可能有修改数据的事务提交了,这种