数据库事务学习理解(二)事务是如何保证ACID的

如何保证原子性(Atomicity):

要么全部完成,要么全部取消,当对数据库进行操作时,根据业务逻辑,我们会操作个表中的数据,当一步操作出错时,会让该事务中的所有操作都回滚,数据还是未操作时的样子。

begin; -- 开始一个事务
update table set A = A - 100; 
update table set B = B + 100;
-- 其他读写操作
commit; -- 提交事务

在begin和commit之间的操作都完成后,才将结果提交给数据库保存,只要有一条失败,就撤销之前的操作,这要就保证了同生共死

如何保证隔离性(Isolation):

有多个事务同时进行,最后结束时,最终的结果应该是相同的
原子性的问题解决了,但是在另外的事务中同时修改数据,数据的一致性就会被破坏,所以要有隔离机智,一个事务完成后,另一个事务才能开始,要加上互斥锁。
具体步骤:
1.先获得锁,然后才能修改数据A
2.修改并提交事务之后释放锁,给下一个要修改数据A的事务
3.然后第二个事务开始修改数据并提交。
对于同一个数据,只有一个事务能持有互斥锁,没有锁的事务,需要等待其他事务释放锁
只有当事务提交或者回滚后,才能释放锁。在这期间,其他事务只能读取数据

隔离级别:

1.串行化:最高的隔离级别,两个事务百分百隔离,串行执行。
2.可重复读(MySQL默认模式):这些数据对其他正在执行的事务是可见的。如果成功修改了一条数据,修改结果对于正在运行的事务仍然不可见。所以只是对于新数据产生了新隔离,旧数据还是旧隔离。
3.读取已提交(Read committed,Oracle、PostgreSQL、SQL Server默认模式):可重复读+新的隔离突破,A事务在读取D数据时,B事务对D数据进行了删除或者修改操作并提交,A重新读取时就会看到B事务修改以后的数据。A事务在第一次读取的数据和第二次数据不一样,这叫幻读
4.读取未提交:读取已提交+新的隔离突破:A事务在读取D数据时,B事务对D数据进行了删除或者修改操作并提交,A重新读取时就会看到B事务修改以后的数据。但是此时A事务出错回滚了,B还是会看到A事务修改的数据结果,看到的数据是毫无用处的,这叫脏读

如何保证持久性(Durability):

当事务结束时,数据会永久的保存到数据库里
事务会保证两点:
1.事务提交时,就算数据库崩溃,也会存储在磁盘中。
2.事务回滚时,对应数据也会回滚。

如何保证持久性(Consistency):

保证账户的数据不会凭空消失或产生,该特性依赖原子性,隔离性

世界上有10种人,一种是懂二进制的,一种是不懂二进制的。

感谢您的收看,如有哪里写的不对 请留言,谢谢。

发布了71 篇原创文章 · 获赞 54 · 访问量 42万+

猜你喜欢

转载自blog.csdn.net/weixin_43326401/article/details/104003945