MySQL5.0版本引入事务机制,才得以进入企业市场的。
目录
1.没有事务机制时,情况很糟糕
平时在修改一份重要文件的时候,通常先备份一下,然后在副本里面去修改;在数据库领域也是如此,如果SQL语句直接操作数据文件是非常危险的;
比如,给员工涨工资,UPDATE语句执行的过程中,系统突然重启了或者停电了,UPDATE语句没有执行完,于是哪些记录修改了,哪些记录没有修改就弄不清了;

……………………………………………………
2.undo日志,redo日志
日志文件就相当于是数据文件的一个副本;SQL语句操作什么样的记录,MySQL数据库就会把这些记录拷贝到undo日志中;增删改查的操作就会记录到redo日志中;
如果这些操作没有什么问题,最后把redo日志和数据文件做一个同步就可以了,即便同步过程中出现了停电、系统重启等问题,因为有redo日志的存在,在重启了MySQL之后,继续完成这个同步就可以了;
同步成功以后,我们修改的数据就真正写到数据文件中了;
即说白了,就是先在undo这个存储记录的日志文件里,尝试去操作,没有问题后再执行同步;;;即使出现中断,因为有日志的存在,还是可以继续同步。

……………………………………………………
3.事务机制引入

……………………………………………………
4.【自动提交事务】和【手动管理事务】
(1)●以前在使用SQL语句的时候,没觉得使用事务啊:这是因为MySQL默认情况下,执行一条SQL语句之前都会为我们开启事务,等这条SQL语句执行完毕之后,MySQL会提交事务(即让redo日志和数据文件作作同步);
● 如果完成某个业务,只需要一条SQL语句,那么MySQL这种自动提交事务的模式是没有问题的;
(2)● 但是,某些业务,需要多条SQL语句的时候,MySQL这种自动提交事务的模式就GG了;如下图中的业务,需要两条SQL语句,一条UPDATE语句和一条DELETE语句;;而且UPDATE语句和DELETE语句必须是“原子的”,从外界业务的角度来看,这两条语句是不可分的,要么全部成功,要么全部失败。
● 要想实现这个效果,UPDATE语句和DELETE语句必须在同一个事务之下运行才行;;;这就涉及到手动去管理事务了;
● 执行过程中,如果发生了意外中断,重启后,如果希望MySQL继续执行事务,就让redo日志继续同步就可以了;;;如果不想MySQL继续同步,就可以把undo日志文件中的数据同步到数据文件中,这样数据文件就恢复到数据提交之前的状态了;
(3)事务回滚:(假如一些特殊原因,当事务不能继续提交的时候,就应该把事务回滚;;;比如,抢购商品的时候,虽然抢到了商品,但是由于支付晚了,那么这个事务就需要回滚,而不能提交);
事务回滚:只需要把redo和undo中的数据做一个标记就可以了,这些被标记过的数据就不会被同步到数据文件中了;

……………………………………………………
5.【手动管理事务】的语法,案例演示

案例:看下整个流程





COMMIT:提交的时候,是提交的整个事务的所有内容。一个事务中的所有SQL语句是一个整体,共进退的!!!
即,是将最终结果持久化到数据库,而不是把中间状态持久化到数据中;
如果在最后,使用ROLLBACK回滚:
即可以这样理解,一旦使用ROLLBACK,本次事务的那些SQL操作 在 redo日志中的临时数据就会被标记,然后就失效了,然后就没有然后了……
即,回滚的时候,mysql把该事务所有的数据都打上标记,这些数据就全都不会同步到数据文件中了;



……………………………………………………
6.事务的ACID属性:

(6.1)事务的原子性

(6.2)事务的一致性
事务通过【阻止事务之间相互读取临时数据】,来实现事务的一致性;
否则,如果事务之间可以相互读取临时数据,比如A原本有500块,【一个事务是A向B转10块,但是这个事务还没有提交的时候,此时在这个事务中临时文件中,A中还有490块,但其实此时在数据文件中A还是有500块的,因为这个事务还没有提交嘛】,此时,【另一个事务,向A中转100块,如果这个事务可以读取上一个事务的零时文件,那么在这个事务中,A中就会有590块,然后整个事务提交后,数据文件中A就变成590块了】。。。。这样以后,如果A向B转10块这个事务回滚取消了,取消就取消了,最后的结果是A中有590块,,,,10块钱就不翼而飞了,出了问题。
所以,为了不出现歧义的数据,MySQL的事务在执行的时候,是完全的隔离的;

(6.3)事务的隔离性
● 每个事务只能看到自己事务内的相关数据,别的数据的临时数据在当前事务中是不可见的;正是因为这种隔离性,让每个事务都认为自己是当前时间段内数据库运行的一个唯一事务;
● 事务是如何实现隔离性:undo和redo日志中,数据都会被标记是属于那个事务的,所以事务执行过程中,只能读到自己的临时数据;

(6.4)事务的持久性

MySQL事务机制与ACID属性详解
174万+

被折叠的 条评论
为什么被折叠?



