3.mysql事务
一、事务简介
- (1)在MySQL中只有使用了Innodb数据库引擎的数据库或表才支持事务
- (2)事务处理可以用来维护数据库的完整性,保证成批的SQL语句要么全部执行,要么全部不执行。
- (3)事务用来管理insert,update,delete语句。
二、事务的四大特性
一般来说,事务必须满足四个条件:(ACID)
原子性(Atomicity):一个事务中的所有操作,要么全部完成,要么全部不完成,不会结束在中间环节,事务在执行过程中发生错误,会被回滚(RollBack)到事务开始前的状态,就和没有执行过一样。
一致性(Consistency):在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度串联性以及后续数据库可以自发性地完成预定的工作。(比如:A向B转账,不可能A扣了钱,B却没有收到)
隔离性(lsolcation):数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交((read committed)、可重复读(repeatable read)和串行化(Serializable)。(比如:A正在从一张银行卡里面取钱,在A取钱的过程中,B不能向这张银行卡打钱)
持久性(Durability):事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
三、事务的回滚
begin ->commit ,commit之后才会修改表
四、事务特性---隔离性
隔离强调的是两个或两个以上同时发生(并发)的业务同时操作一个数据库,为了让两个事务方面能看到、得到正确的结果,一方面还是保证一定的效率而产生的不同的隔离级别
4.1、事务的隔离级别(4个):
- 读未提交:read uncommitted
- 读已提交:read committed
- 可重复读:repeatable read
- 串行化:serializable


4.2、读未提交
能读取到别的人未提交的事务
- 事务A和事务B,事务A未提交的数据,事务B可以读取到
- 这里读取到的数据叫做 “脏数据”,也叫 脏读
- 这种隔离级别最低,这种级别一般在理论上存在,数据库隔离级别一般都高于该级别
简而言之,第一个事务没提交,别的事务就读取,第一个事务有可能回滚,这是不正确的。
案例:
楠哥发工资了,老婆让楠哥把工资打到他老婆的账号上,但是该事务并未提交,就让老婆去查看,老婆一看真的打了钱了,高高兴兴关了网页,此时楠哥急中生智进行回滚,钱瞬间回来,一次蒙混了一个月工资。所以楠哥老婆看到的数据我们称之为"脏数据"。
4.2、读已提交
能读取到别的人已提交的事务

注意:当隔离级别设置为Read committed时,避免了脏读,但是可能会造成不可重复读。
大多数数据库的默认级别就是Read committed,比如Sql Server , Oracle。如何解决不可重复读这一问题,请看下一个隔离级别。
4.3、可重复读
A事务在本次事务中对未操作的数据进行多次查询,发现第一次没有,第二次出现了就像幻觉一样。或者第一次有而第二次没有。针对delete和insert。
案例:
楠哥的老婆在银行部门工作,她时常通过银行内部系统查看楠哥的账户信息。有一天,她正在查询到楠哥账户信息时发现楠哥只有一个账户,心想这家伙应该没有私房钱。此时楠哥在另外一家分行右开了一个账户,准备存私房钱。一次同时楠哥老婆点击了打印,结果打印出的楠哥账户居然多了一个,真实奇怪。

4.4、串行化(排队)
- 事务A和事务B,事务A在操作数据库时,事务B只能排队
- 这种隔离级别很少使用,吞吐量太低,用户体验差
- 这种级别解决 “ 幻读” ,每一次读取都是从数据库中读取真实的数据,事务A和事务B串行,而不并发
- 别的地方一用这个数据,你就不能修改、删除,直到别的地方提交


浙公网安备 33010602011771号