MySQL 基础之十四:事务
主要内容:
本文的主要讲解什么是事务、事务的特性等知识——比较重要
事务(transaction):
transaction 中文意思就是交易,可能是国人翻译的时候可能是追求高大上,就索性把它叫做事务。事务是一个完整的业务逻辑单元,不可再分。说人话就是:在一个两个账户进行转账的业务中,A 账户转给 B 用户 100 元,那么 B 用户就要多 100 元,这整个过程就是一个完整的业务逻辑单元,这个操作不能分裂开来,A 少钱和 B 多钱必须同时成功,不允许出现一个成功,一个失败这种情况发生。现在应该理解这个事务是咋回事了吧。
和事务有关的操作:
和事务有关的操作只有 DML 语句——insert、delete、update
这是为什么呢?以上三种操作是和数据库中的表的数据(记录)有关的,事务的存在就是为了保证数据的完整性和安全性。
小贴士:假设一个业务逻辑单元只需要 1 条 DML 语句就可以搞定,这个时候就不需要事务来保证数据的完整性了。但实际上,一个业务逻辑是需要多条 DML 语句共同完成——比如转账业务逻辑。
事务的特性:
事务包含四大特性——简称为 ACID
原子性(atomic)——A:事务是最小的工作单元,不可分割。
一致性(consistency)——C:事务必须多条 DML 语句同时成功,或者同时失败。
隔离性(Isolation)——I:事务 1 和事务 2 之间互相隔离,不会互相影响。
持久性(durability)——D:最终的数据必须持久化到硬盘里,事务才算成功的结束。
事务之间的隔离性:
事务的隔离性存在隔离级别,SQL 标准下,隔离级别包括 4 个:
第一级别:读未提交(read uncommitted)
对方事务还没有提交,我们的当前事务可以读取到对方未提交的数据。这种现象也称为脏读(dirty read)
第二级别:读已提交(read committed)
对方事务提交之后的数据我方可以读取到,解决了脏读问题。但是读已提交存在一个问题:不可重复读。
第三级别:可重复读(repeatable read)
想了解可重复读,要先了解不可重复读问题:就是我第一次,是 a,当我再次读的时候,又成可 b,不敢不能重复读取啊,一重复读取,查询结果就会变,到底用哪个是个事啊。
因此可重复读解决了不可重复读的问题,但是还存在读取幻象的问题。
第四级别:序列化,串行化(serializable)
先了解一下幻象是什么?:我第一次读,查询结果是一条数据,当我用同样的查询语句再次读取时,变成了 2 个甚至更多的数据,难道我出现幻觉了吗,这就是幻象。
串行化解决了所有的问题,但是效率低,事务需要排队。
版权声明: 本文为 InfoQ 作者【打工人!】的原创文章。
原文链接:【http://xie.infoq.cn/article/0fd746a2ccd93bd3fa4dc77c1】。文章转载请联系作者。
评论