一、事务,为什么这么重要?
1.1 诞生背景
在InnoDB存储引擎之前,开源世界没有一个特别好的带事务的免费数据库。
只能去微软买SQLServer,或者去Oracle买,非常贵,几十万上百万。
因此,当带事务的InnoDB存储引擎集成进了MySQL之后,立马火了。
1.2 事务的特性 ACID
A:一个事务,要么成功,要么失败。操作的数据,要么全部整体成功,要么全部整体失败。
C:开始、结束之间,各个状态是一致的。
I:事务与事务之间是独立的、互不影响的。
D:事务,落在数据库后,不能轻易丢失。
二、事务的原子性 Atomicity
2.1 两阶段提交:先prepare,再提交
比如,修改了5条数据,要么全部修改成功,要么全部修改失败。不能成功3条、失败2条。
因为,很长时间内,认为原子不可再分。
(真实情况是学科发展,能够再分:中子等)
2.2 事务回滚:undo log
如果事务提交不成功,就回滚。
三、事务的一致性 Consistency
在实际业务中,体现的不多。
3.1 事务的状态切换:必须是前后统一的
比如:
小明给小红转账1000元。
状态1:事务提交之前:小明:1000元。小红:0元
状态2:事务提交之后:小明:0元。 小红:1000元
上述两个状态是统一的,因为钱的总和都是1000元。
一致性这个名字起的不够好,我个人认为叫统一性会更恰当。
3.2 锁、两阶段提交
四、事务的隔离性 Isolation
隔离性是事务的四大特性中,问题最多的。因为涉及到并发版本控制。(后续会讲)
4.1 锁、undo log
比如:
我的事务1:要给小明扣款100元
别人的事务2:要给小明扣款50元
当小明的事务提交之前,别人是不能看到小明的事务操作过程:扣款100元。
别人会认为,小明还是原来那些钱。
五、事务的持久性 Durability
5.1 redo log
只要写到redo log,即四个环形文件里,就表示已经记下了。
Comments | NOTHING