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为正确的情况。