mysql的事务

0、事务

事务是关系型数据库区别于一切文件系统的重要特性,例如:文件系统的两个文件,修改其中一个文件的时候系统崩了,那么事后,很难再保证两个文件的一致了。
通常数据库崩溃以后,还可以恢复数据,保证数据的一致性。
数据库事务,是一组具有原子性的SQL语句,组内的sql语句要么全部成功,要么全部失败。
mysql的ACID特性详解

1、事务的ACID特性

A原子性(atomicity)

一个事务必须被视为一个不可分割的最小工作单元;即要么全部成功,要么全部失败,不存在只执行其中一部分的操作;

C一致性(consistency)

数据库总是从一个一致性的状态转换到下一个一致性的状态。即在事务开始前和事务结束后,数据库中数据的完整性没有被破坏。(例如,在执行到第三、第四条sql语句时系统崩溃了,账户中的金额不会有任何改变,因为事务没有被提交,所以事务中所做的修改也不会保存到数据库。)

I隔离性(isolation)

事务的4种隔离级别。

D持久性(durability)

一旦事务被提交,则其所做的修改就会被永久的保存到数据库中。即,事务一旦提交,即使系统崩溃,修改的数据也不会丢失。

2、事务的隔离级别

未提交读(read_uncommitted)

即使没有提交,对其他事务也是可见的。会产生脏读。

提交读(read_committed,又叫不可重复读 或 读已提交)—>大多数数据库默认的隔离级别

一个事务从开始到提交前,所做的任何修改对其他事务是不可见的。言外之意,只要事务提交后,就可以看到了。所以会产生不可重复读的问题。
提交读解决了“脏读”的问题。

不可重复读

在一个事务中多次读取id=1的数据,第一次读取时,name=“李磊”,而另一个事务把name改为“李杨”,第二次读取时name=“李杨”。两次读取的结果不一样,所以叫不可重复读。

可重复读(repeatable_reaaad)—>mysql默认的隔离级别

在一个事务中多次读取同样记录的结果是一致的。
可重复读,也解决了“脏读”的问题。同时解决了“不可重复读”的问题。
理论上,可重复读,还是无法解决“幻读”的问题。
InnoDB和XtraDB存储引擎通过MVCC(多版本并发控制协议 Multiversion Concurrency Control)解决幻读问题。

幻读

当前事务在读取某个范围内的记录时,另外一个事务又在该范围插入了新的记录,当之前的事务再次读取该范围的记录时,会产生幻行。例如,第一次读取是5条记录,第二次成了6条记录。

mysql幻读和不可重复读的区别

不可重复读是select同一个数据发现的到的结果跟刚才不一样。
幻读是比不可重复读高一个级别的错误,读取同一条数据发现跟刚才是一样的,只有读取一堆数据发现忽然多了一个,或者少了一个,就像自己养的一堆柯基莫名其妙多出来一只,刚才明明检查过没有这只的呀,是不是产生了幻觉!

综上,不可重复读针对的是同一条数据,幻读针对的是一片数据。说的再明白一点,不可重复读是由另一个事务的update操作造成的,而幻读是由另个事务的insert或delete操作造成的。

可串行化(serializable)

事务的最高级别,它通过强制事务串行执行,避免了以上所有问题。
缺点:会导致大量的超时和锁争用的问题,实际应用中很少用到这个隔离级别。

总结

隔离性:可串行化 > 可重复读 > 提交读 > 未提交读
并发性:未提交读 > 提交读 > 可重复读 > 可串行化

3、大事务

运行时间比较长,操作时间比较多的事务。

大事务的风险

1、锁定太多的数据,造成大量的阻塞和锁超时。InnoDB默认是行锁,如果数据量太大会锁住很多的记录。
2、回滚时间较长,有时甚至1个小时、几个小时,而且回滚的过程中还会有很多行的记录被锁住,导致用户长达数小时不能访问。
3、事务执行时间长,容易造成主从延迟。引起数据库系统崩溃。

大事务案例:

阿里的余额宝,每天都会计算前一天用户的收入所得,而如果我们在一个事务中对所有用户的理财收入进行计算并更新到余额中,这时数亿用户数据的更新需要几个小时,这时一旦出现问题,事务需要回滚,这时所用的时间不可估量。而且更新的过程中加锁使得大量用户无法用余额宝买东西。

如何处理大事务

1、避免一次处理太多的数据。对于一次处理成百上千的数据,可以分批次操作。
2、移除不必要在事务中执行的select操作。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值