事务及隔离级别
事务就是一组原子性的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