快速理解:数据库事务Affair


There is no doubt that

事务的四大特性ACID


- Atomic 原子性

  • 只有使据库中所有的操作执行成功,才算整个事务成功;事务中任何一个SQL语句执行失败,那么已经执行成功的SQL语句也必须撤销,数据库状态应该退回到执行事务前的状态。

例子:一个转账事务,用户A有500,用户B有300,用户A—>转账200—>用户B.
首先用户A的账户:500-200=300
用户B的账户:300+200=500
这是一个完整的流程。
但是
首先用户A的账户:500-200=300
数据库炸了!地震海啸了!
这个时候B还没收钱,所以数据库会执行rollback回滚事务,把200块钱还给A。


- Consistency 一致性

  • 指数据库事务不能破坏关系数据的完整性以及业务逻辑上的一致性。

例子:还是刚刚的例子,A---->转账200---->B ;
—>A:500-200=300
—>B:300+200=500
转账前的A+B:500+300=800
转账后的A+B:300+500=800


- Isolation 隔离性

  • 事务的独立性也有称作隔离性,是指两个以上的事务不会出现交错执行的状态。因为这样可能会导致数据不一致。

隔离不好会导致以下问题

隔离级别
未提交读:脏读、不可重复读、虚读都有可能发生。
已提交读:避免脏读,但是不可重复读和虚读有可能发生。
可重复读:避免脏读和不可重复读,但是虚读有可能发生。
串行化:最高级别。可以避免以上所有读问题。缺点:加很多锁,限制太大,可能锁一个表,影响数据库性能。行锁,列锁。

理解:脏读、不可重复读、幻读参考这个链接非常不错↓

https://blog.csdn.net/qq_33591903/article/details/81672260

MYSQL默认:可重复读
Oracle默认:已提交读

但是加锁可能会出现↓

死锁:当A操作1资源,B操作2资源,然后A操作的1资源需要操作2资源,就会等待B释放2资源;同样,B操作的2资源需要操作1资源,就会等待1资源。互相等待,造成死锁。


- Durability持久性

  • 指的是只要事务成功结束,它对数据库所做的更新就必须永久保存下来。即使发生系统崩溃,重新启动数据库系统后,数据库还能恢复到事务成功结束时的状态。

数据库是先写日志,再执行SQL语句。

例子:一如既往,A---->转账200---->B,当A的钱扣掉后,就数据库就死机了。然后在看到数据后,数据库会核对日志后,把数据修改rollback为正确的情况。

发布了53 篇原创文章 · 获赞 0 · 访问量 4153

猜你喜欢

转载自blog.csdn.net/qq_36453423/article/details/103505711