1、事务
数据库操作的最小工作单元。可以是由一条或者多条sql语句组成的不可分割的单元,要么都执行,要么都不执行。
并且符合ACID四个特性。
1、 原子性:
事务中包含的操作要么都做,要么都不做【比如更新表中100条数据,更新了20条出问题了,那这20个数据要回滚到没有更新的状态】
2、 一致性:
事务的执行结果必须是使数据库从一个一致性状态变到另一个一致性状态,不会一部分执行成功,一部分事务并未执行成功【要么全成功要么全失败】
3、 隔离性:
同一时间,只允许一个事务请求对一个数据请求,事务间不干扰
4、 持久性:
事务一旦执行完成,它对数据库的改变就是永久的,不受其他操作或故障的影响
2、并发事务有哪些问题
1)脏读:
一个事务读取了另外一个事务正在进行更新的数据,但是这个事务还没有提交这个数据(就是可能事务会失败需要回滚)
2)不可重复读:
一个事务两次执行同一条查询语句,读取的结果不一致。可能是另一个事务修改了数据
3)幻读:
一个事务两次执行同一条查询语句,读取的结果多出或少了一些数据。可能是另一个事务修改了数据
4)修改丢失:
两个事务对同一记录进行修改,后修改的记录会覆盖前面的记录
3、事务隔离机制(用于解决并发问题)
- 在MySQL内部加锁解决并发问题,就是配置事务隔离级别
(可以解决脏读、不可重复读、以及幻读)
1) 读未提交:
一个事务可以读取另一个事务未提交的数据。(什么问题也没有解决)
2) 读提交(不可重复读):
一个事务只能读取另一个事务提交的数据(解决了脏读)
3) 可重复读
一个事务多次读取同一条记录,返回的结果是一致的(解决了不可重复度)
4) 序列化(串行化)
事务只能一个个进行,也就是序列化执行,隔离级别最高
InnoDB默认的是可重复读级别隔离机制
4、隔离机制的实现
主要靠读写锁(主要是表锁)和MVCC
MVCC内部主要是控制:行锁,间隙锁(解决了幻读),next-key锁
5、MVCC (行级锁主要由MVCC实现)
多版本并发控制,就是同一条记录在系统中存在多个版本。(保证数据一致性的前提下提供一种高并发的访问性能,对数据读写在不加锁的情况下实现互不干扰,实现隔离性)
依赖于:
隐藏字段(事务id,回滚指针,生成没有主键的B+树聚簇索引ID)、
read view(记录多个事务在修改数据的时候事务之间的可见性,可以看到哪些事务中的数据。)、
undo log(回滚,以及存放了数据修改之前的快照)
标签:总结,事务,隔离,要么,MySQL,执行,数据,读取 From: https://blog.csdn.net/Mikkkee/article/details/137038403