Mysql事务的四大特性(ACID)和事务隔离级别
文章目录
一.什么是事务?
一句话—>事务是一个程序执行单元。
是指在访问,更新数据库中数据时的一个不可分割的执行单元。也就是要么不做,要做就做完。不能做一半就不做了。
二.打个比方
小何给女朋友小美转账了520元,正常情况下,小何的账户上面应该减少520元,小美的账户上增加520元,但是现在出现了一些问题。小何的账户上减少520元,系统正想让小美的账户上面增加520元,这个时候,银行系统崩了。这下就出现问题了,小何520元减少了,但是小美的账户上面却没有到账520元,小美一气之下把小何拉黑了,可想而知。这个后果是多么的严重。
三.事务的四大特性是什么?
- 原子性(Atomicity):一个事务是一个不可分割的工作单位,事务中包括的操作要么都做,要么都不做。
- 一致性(consistency):事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的,就是可以执行完成一个事务后,数据库不存在只执行一部分的事务,就可以就理解成如果小何小美完成了转账功能。这个时候就是一致的。
- 隔离性(isolation):一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
- 持久性(durability):持久性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。
四个特性怎么记?
原来隔着一主持:为啥记不住,因为你还隔着一个主持,还没有看破红尘。(如果不是实在记不住,请勿使用)
四.事务隔离级别有哪些?
读未提交(Read Uncommitted):
允许脏读取,但不允许更新丢失。如果一个事务已经开始写数据,则另外一个事务则不允许同时进行写操作,但允许其他事务读此行数据。该隔离级别可以通过“排他写锁”实现。
举个例子:小何其实是准备给小美转520元的,但是按岔了成250于是250块钱被转给了小美,当然这个时候小何还没有提交事务。这个时候小美一下看到了账户上面的250,十分的生气,啪的一下子就小何拉黑了。手机扔到了一边。小何在转账的时候也发现了转成了250,连忙回滚事务,将转账金额改成了520后才提交了事务。然后小何开心的拿起手机,发信息给小美,却发现被拉黑了。。。而这个时候,其实小何账上少了520,小美多了520,但是小美手机扔到了一遍,还以为小何给她转了250.而这种错误就叫做脏读(读了未提交事务的数据)。
读提交(Read Committed):
允许不可重复读取,但不允许脏读取。这可以通过“瞬间共享读锁”和“排他写锁”实现。读取数据的事务允许其他事务继续访问该行数据,但是未提交的写事务将会禁止其他事务访问该行。
举个例子:小美和小何拿着520的账户去逛街买衣服,小美选了一件500的衣服,支付前,小美的账户上面查看有520元,于是小美升出二维码支付,但是这个时候,学校在绑定的小美的账户上面扣除了300的书本费,并且提交了事务,小美的账户被更新成为了220元,小美这时被告知账上没有足够的前支付。但是小美很纳闷,我刚不是有钱的吗?这就是不可重复读(同一个事务两次读取的内容不一样,读取无法重复)
可重复读取(Repeatable Read):
禁止不可重复读取和脏读取,但是有时可能出现幻读数据。这可以通过**“共享读锁”和“排他写锁”实现。读取数据的事务将会禁止写事务**(但允许读事务),写事务则禁止任何其他事务。
可重复读比较简单,就是在小美结账时不让其他的UPDATE操作动她的账户,当学校的扣费事务到来时拒绝掉,这个时候你就可以重复读取到相同的账户金额,并且付款成功。但是这种情况可能出现幻读的情况,其实本质原因是因为可重复读只能解决其他的UPDATE事务,对于INSERT操作无能为力。那幻读又是什么?
举个例子:小美被告知账上没钱时,比较惊讶,于是她来到了学校教务处查询自己账户记录。(小美事务开启)小红看到自己的账户上面时被扣了300元书本费,还剩下220元,于是小红提出让老师打印自己的账户记录回家报销,但是在这个时候,好男人小何怕小美伤心又给小美转账了300元,并且完成了事务,提交了小何事务。于是在打印的账户记录出现了300的入账记录,小美十分开心,对着小何说:"我是不是出现了幻觉,刚刚不是只有220元的吗?怎么多了300元?",小何此时深藏功与名,而这个就叫做幻读。
序列化(Serializable):
提供严格的事务隔离。它要求事务序列化执行,事务只能一个接着一个地执行,不能并发执行。仅仅通过“行级锁”是无法实现事务序列化的,必须通过其他机制保证新插入的数据不会被刚执行查询操作的事务访问到。
序列化就是按部就班的执行,可以避免脏读、不可重复读与幻读,但是可想而知,这种方式会降低数据库的效率。
希望对你有帮助!