事务:一组特定的SQL语句的集合(ACID)
A 原子性:要么全部执行成功,要么全部执行失败–事务回滚
C 一致性:事务执行前后完整性约束
I 隔离性:消除多个事务之间的影响
D 持久性:事务执行的结果要在磁盘上永久的保存
如果没有隔离性,会出现什么问题?(如下图123,按顺序)
1.脏读–执行中
A事务中将张三的工资由5000更新到8000,此时A时间片轮转完,交给B事务。
B事务获取到张三的工资是8000了,接下来进行一系列的操作,B时间片轮转完,交给A事务。
此时由于某种原因张三的工资暂时不能涨了,那么就需要回滚到原来的状态,但是此时B事务的所有的操作都是由张三的工资是8000完成的,所以此时B事务获取的所有的数据都是没有意义的
这就是所谓的“脏读”–事务获取到其他事务 执行中 的结果
解决方法:事务的执行过程中获取不到其他事务执行中的结果。
2.不可重复读(在脏读已经解决的基础上)–执行前后,不同阶段,是由修改操作导致的
A事务中将张三的工资由5000更新到8000,A事务还没有执行完成,那么B事务此时如果需要获取张三的工资,那么会得到张三的工资是5000,因为获取的是事务执行前的结果。
再往下,A事务此时提交了,再从事务B中获取张三的工资,就变成了8000。那么是使用5000呢还是8000呢,就会产生二义性。
解决方法:事务在其他的事务执行过程中开启,其他事务相对于该事务透明。

事务A在执行过程中事务B开启,那么A事务对于B事务来所是透明的,B事务获取的数据都是A事务执行之前的数据
3.幻读–由插入或者删除的操作导致的
A事务先插入一个5000工资的李四,然后事务B进行查询5000工资的人数是1,这是执行前的结果
然后等待A事务提交之后,事务B再进行查询,此时的查询结果是2。
但是在相同内部会提供一个间隙锁机制来解决这个问题,所以在操作的时候不会得到2,仍然是1。
不可重复读和幻读的区别?
基本的流程是相同的,但是对于数据的处理是不同的。如果是由于update修改操作导致的说就是不可重复读;如果是由于插入或者删除的操作导致的,那么就是幻读。




select @@tx_isolation;//查询当前的隔离级别
set tx_isolation = "READ-UNCOMMITTED";//设置隔离界别未提交读
**原子性、持久性:**使用日志文件处理 redo log重做日志 undo log未作日志
redo log重做日志:事务将要执行的每一个操作(防止断电等意外导致的语句不能全部执行成功)
将要执行的操作记录在日志文件上,在这有一个日志先行机制,意思是日志生成好之后,并不是执行里面的语句,而是将这些语句刷新到磁盘上,磁盘上就不会丢失了
undo log未作日志:保存事务执行过程中的每一个执行状态点(保证执行失败的时候回退点问题)

2615

被折叠的 条评论
为什么被折叠?



