MySQL综合应用二:事务机制一:事务的基本介绍

MySQL事务机制与ACID属性详解

MySQL5.0版本引入事务机制,才得以进入企业市场的。

目录

1.没有事务机制时,情况很糟糕

2.undo日志,redo日志

3.事务机制引入

4.【自动提交事务】和【手动管理事务】

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

6.事务的ACID属性:

(6.1)事务的原子性

(6.2)事务的一致性

(6.3)事务的隔离性

(6.4)事务的持久性


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)事务的持久性


 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值