目录
③可重复读(Mysql的默认隔离级别就是Repeatable read)
1定义
数据库事务就是一组针对数据库的操作(可能是访问或者更新数据),这些操作要么不做要么全做。
2 性质
①原子性
和事务有关的sql语句要不不执行,要不全部执行。通过恢复系统实现。
②隔离性
各个事务之间不互相影响,彼此是隔离的。通过并发系统实现。
③持久性
一个事务一旦提交,它对于数据库的影响是永久的。通过恢复系统实现。
④一致性
事务执行前数据库处于一致性状态(数据正确,符合约束),事务执行后数据库也处于一致性状态(通过并发控制系统实现)。
3并发执行优缺点
好处:提高系统吞吐量,减少平均响应;坏处:破坏数据库一致性。
可能出现问题:
①不可重复读(前后多次读取,数据内容不一致)
事务多次读取的结果不一致,在两次读取之间数据被修改导致事务读到和上次不一样的结果。
②幻读(前后多次读取,数据总量不一致)
事务A在执行读取操作,需要两次读取某些记录,前一次查询数据总量后,此时事务B执行了新增或删除数据的操作并提交后,这个时候事务A读取记录时发现这些记录消失了或多了,就像产生了幻觉一样。
③脏读(读取未提交数据)
一个事务对数据进行了修改(写入磁盘),但未提交,另一个事务可以读取到未提交的数据。如果第一个事务发生某些状况回滚了,第二个事务读到的了脏数据。
4调度
调度是指事务的执行顺序,分为串行调度,属于同一事务的指令紧挨在一起,并行调度,不同事物可交叉执行,并行调度在某种意义上等价于一个串行调度。
冲突可串行化:
冲突指令,当两条指令对同一数据进行操作,两条指令中至少一个实write操作时称两条指令是冲突的。
非冲突指令交换顺序不会影响最终调度结果。
冲突等价:如果调度s经过一系列非冲突指令交换称调度s',则称s与s'调度 冲突等价。
当一个调度s与一个串行调度冲突等价的时候,则该调度室冲突可串行化的。
优先图判定冲突可串行化:
冲突指令(对同一数据的两个操作其中一个是写)T1先发生,则记T1->T2,当优先图无环时表示事务的这个调度是冲突可串行化的。等价于优先图的拓扑排序。
5事务隔离级别
①读未提交
允许读取未提交数据,当事务A对数据更新时,不允许其他事务来更新,但允许读。(所以脏读,幻读,不可重复读均会出现)。
②读已提交(大部分数据库默认的隔离级别)
允许读取已经提交数据,当事务A进行数据更新时不允许其他事务对数据进行任何操作(包括读)(所以不可能出现脏读,回滚之后才提交),但事务A读的时候,其他事务可以进行更新读取,(这导致了不可重复读和幻读)。
③可重复读(Mysql的默认隔离级别就是Repeatable read)
只允许读已提交数据,且一个事务两次读取一个数据间,其他事务不得更新该数据(能防住一部分幻读)。
④可串行化
所有事务排队执行,并发性能明显下降。读写数据都会锁住整张表。