事务及隔离级别

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

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

事务处理的几个术语

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

事务的四大特性(ACID)

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

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

隔离级别

隔离级别 脏读可能性 不可重复读可能性 幻读可能性 加锁读
READ UNCOMMITED YES YES YES NO
READ COMMITED NO YES YES NO
REPEATALE READ NO NO YES NO
SERIALIZABLE NO NO NO YES

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

相关文章: