MySQL之事务相关总结

什么是事务?

事务是逻辑上的一组操作,要么都执行,要么都不执行。

事务最经典也经常被拿出来说例子就是转账了。假如小明要给小红转账1000元,这个转账会涉及到两个关键操作就是:将小明的余额减少1000元,将小红的余额增加1000元。万一在这两个操作之间突然出现错误比如银行系统崩溃,导致小明余额减少而小红的余额没有增加,这样就不对了。事务就是保证这两个关键操作要么都成功,要么都要失败。

事物的四大特性(ACID)

 

  1. 原子性(Atomicity): 事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么完全不起作用;

  2. 一致性(Consistency): 执行事务前,多线程读取数据保持一致, 执行事务后,多线程读取数据保持一致多个事务对同一个数据读取的结果是相同的;

  3. 隔离性(Isolation): 并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库是独立的;

  4. 持久性(Durability): 一个事务被提交之后。它对数据库中数据的改变是持久的,即使数据库发生故障也不应该对其有任何影响。

事务隔离级别有哪些?MySQL的默认隔离级别是?

SQL 标准定义了四个隔离级别:

  • READ-UNCOMMITTED(读取未提交): 最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读

  • READ-COMMITTED(读取已提交): 允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生

  • REPEATABLE-READ(可重复读): 对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生

  • SERIALIZABLE(可串行化): 最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读

 

用例子讲一下 脏读,幻读,不可重复读的区别

脏读:事务A在执行的过程修改了数据库中的数据,这时事务B插了进来,读取到了事务A修改之后的数据并且提交了上去,这时事务A由于某些原因进行了回滚,那么事务B读取的就是事务A的脏数据

  相当与你在外面吃烧烤,然后有一块肉掉了,恰好掉到了一个外出觅食的蚂蚁面前,蚂蚁立即掉头回去报告,这是你把掉的肉捡了起来,当蚂蚁带他的兄弟们回来的时候,发现没有肉,这时候蚂蚁带给蚁群的就是脏数据。

不可重复读:事务A读取了一组数据,在执行逻辑的时候,事务B修改了这条数据,当事务A再次读取时候,发现数据前后不一致了,这就是不可重复读。

  相当与你在外面吃烧烤,掉了一块肉,恰好掉到了一个外出觅食的蚂蚁面前,蚂蚁回去报告,这是你把掉的肉捡了起来,却意外的碰掉了桌子上的韭菜,这是你叹了一口气,说不想捡了,当蚂蚁带他的兄弟们回来的时候,发现这个地方不是肉,而是韭菜,这时候蚂蚁带给蚁群的就是不可重复读数据

幻读:事务A根据条件读取了数据,这时事务B插了进来,修改了数据库里的数据,导致事务A在做第二次查询的时候发现第二次读取的数据比第一次要多,这就是幻读

  相当与你在外面吃烧烤,掉了一块肉,恰好掉到了一个外出觅食的蚂蚁面前,蚂蚁回去报告,你不想捡了,这时你又掉了一块,你叹了一口气也没捡,当蚂蚁带他的兄弟们回来的时候,发现这个不是一块肉,而是两块,这时候蚂蚁带给蚁群的就是幻读数据

总结:头发掉点不成问题,关键就是享受这种成功的喜悦!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值