MySQL中的事务及隔离级别

事务及隔离级别

事务就是一组原子性的SQL语句,或者说是一个独立的工作单元,要么全部执行成功要么全部执行失败
事务的目的就是为了维护数据库的完整性

并非所有的引擎都支持明确的事务处理管理,MyISAM和InnoDB是两种最常使用的引擎,前者不支持明确的事务处理管理,而后者支持。

事务处理的几个术语

  • transaction 指的是一组SQL语句
  • roolback 指撤销指定SQL语句的过程
  • commit 提交一组SQL语句
  • savepoint 事务处理中设置的临时占位符,你可以对它发布回退

事务的四大特性(ACID)

  • aotomicity 原子性
  • consistency 一致性
  • isolation 隔离性
  • durability 持久性

一般的MySQL语句都是直接针对数据库表执行和编写的,这就是所谓的隐试提交(implicit commit)
即提交操作是自动进行的。但是,在事务处理快中,提交不会隐含的进行,为进行明确的提交,要使用commit

隔离级别

隔离级别脏读可能性不可重复读可能性幻读可能性加锁读
READ UNCOMMITEDYESYESYESNO
READ COMMITEDNOYESYESNO
REPEATALE READNONOYESNO
SERIALIZABLENONONOYES

1、READ UNCOMMITTED (未提交读)

这种级别的含义就是,当第一个客户端开始了一个事务,并未提交,此时第二个客户端能查看第一个客户端事务中
为提交的数据这种被称为脏读,这种级别会导致很多问题,一般很少使用

在这里插入图片描述
在这里插入图片描述
2、READ COMMITTED(提交读)

大多数据库的隔离级别都是这种(但MySQL不是)这种级别的含义是一个事务从开始到提交前所做的任何修改
都是对其他事务不可见的,这中级别也被成为不可重复读。提交读与未提交读恰好相反,这里遍不再截图

3、REPETABLE READ(可重复读)

这是MySQL的默认隔离级别 这种级别的含义是就是,当事务A正在读取某个范围的数据,并未提交,而
事务B此时更改了这个范围的数据并且提交,然后在事务A中继续查询,还是变化前的数据。
但是理论上,可重复读隔离界别还是无法解决幻读的问题,所谓幻读就是指当某个事务读取你某个范围内的记录,
另外一个事务又在该范围内插入了新的记录,当之前的事务再次读取该范围的记录,会产生幻行。InnoDB和XtraDB
储存引擎通过多版本并发控制,解决幻读的问题。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
4、SERIALIZABLE(可串行化)

这个算是最高的隔离界别了,它通过前置事务串行执行,避免了前面说的幻读问题,SERIALIZABLE会在读取的每一行数据上都加锁,所以可能导致大量的超时和锁争用的问题,实际应用中也很少使用到这个隔离级别。只有在非常需要确保数据一致性而且可以接受没有并发的情况下,才可以考虑采用该级别。

参考资料
《高性能MySQL》 Braon Scbwartz,Peter Zaitsev,Vasdim Tkacbenko
《MySQL必知必会》Ben Forta
参考博客
https://www.cnblogs.com/huanongying/p/7021555.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值