事务
1.概念
事务:它是一组SQL组成的一个执行单元,要么全执行要么全不执行
2.特性
ACID
2.1原子性(Atomicity)
事务是一个最小的执行单位,事务里面的SQL要么全执行,要么全不执行,就拿A与B转账为例,一条语句从A里扣钱,另一条语句往B身上加钱,如果这两条语句不能全部执行,而是成功了一部分,那事务就没有存在的意义了。
2.2隔离性(Isolated)
Isolate,顾名思义就是将事务与另一个事务隔离开,为什么要隔离呢?如果一个事务正在操作的数据被另一个事务修改或删除了,最后的执行结果可能无法达到预期。如果没有隔离性还会导致其他问题,
2.3持久性(Durable)
事务完成对数据的修改后,对修改结果是永久的。
2.4一致性(consistent)
比如转账:A给B转账100;A账户减少100,B账户就增加了100。这样就保证了数据的一致性。
3.事务并发带来的问题
3.1更新丢失
双方同时编辑一个文档时,A在修改文档时,B又修改文档,双方都不知道对方的存在,导致后面的人修改完成后会覆盖前面的文档,导致数据丢失。
3.2脏读(Dirty Reads)
一个事务在执行时修改了某条数据,另一个事务正好也读取了这条数据,并基于这条数据做了其他操作,因为前一个事务还没提交,如果基于修改后的数据进一步处理,就会产生无法挽回的损失。(事务没有提交就读取,)
3.3不可重复读(Non-Repeatable Reads)
同样是两个事务在操作同一数据,如果在事务开始时读了某数据,这时候另一个事务修改了这条数据,等事务再去读这条数据的时候发现已经变了,这就是没办法重复读一条数据(两次读到的数据不一样)
3.4幻读(Phantom Read)
事务一开始按某个查询条件没查出任何数据,结果因为另一个事务的影响,再去查时却查到了数据,这种就像产生幻觉了一样,被称作幻读。(第一次读没读到,第二次却读到了)
4.事务的四种隔离级别
4.1读未提交 (Read uncommitted)
读未提交其实就是事务没提交就可以读(可能导致脏读)
4.2读提交(Read committed)
事务提交后才能读(可能导致不可重复读)
4.3可重复读(Repeatable read)(MySQL默认级别)
看名字就看出来了,它的出现就是为了解决不可重复读问题,事务A一旦开始执行,无论事务B怎么改数据,事务A永远读到的就是它刚开始读的值。那么问题就来了,假设事务B把id为1的数据改成了2,事务A并不知道id发生了变化,当事务A新增数据的时候却发现为2的id已经存在了,这就是幻读。(导致幻读)
4.4序列化(serializable)
这个就是最无敌的存在了,所有的事务串起来一个个执行,因为没有并发的场景出现了,什么幻读、脏读、不可重复读统统都不存在的。但是同样的,基本并发能力会非常差。最终,到底什么隔离级别完全要根据自己的业务场景选择,没有最好的,只有最适合的。