Mysql事务隔离级别
一、事务指的是什么?
事务可以看作一个业务逻辑处理单元,这个单元要么执行,要么不执行。
二、ACID的原则
(1)、原子性(Automicity)
(2)、一致性(Consistency)
(3)、隔离性(Isolation)
(4)、持久性(Durability)
三、mysql事务隔离级别
3.1 读未提交
事务A对数据库做的没有提交的操作事务B也能读取,读到的是脏数据。脏数据理解
3.2 读已提交
事务B只能读取事务A已经commit的操作,在事务A没提交前事务B看不到A所做的更改。该级别不支持可重复读,大多数数据库默认该级别。
不可重复读:在事务A没提交前事务B看不到A所做的更改,在事务A提交后事务B能看到A所做的更改,因为事务A更改了数据导致事务B两次查看的内容前后不一致,这就是不可重复读。
3.3 可重复读
不管事务A对数据做什么操作并提交(比如增删改),事务B重复地查看该数据都和它第一次的查看结果一样。该级别可能产生幻读,mysql默认为该级别。
幻读:
有空表table_student(id,name ),id为主键;
事务A和事务B同时查看表内容,都发现为空;
首先事务A向table_student插入一行id为1的数据并提交,然后事务B查看表内容,发现为空(和它第一次的查看结果一样)
再然后事务B向table_student插入一行id为1的数据,问题来了,插入失败,报错:主键冲突。可是事务B插入前查看表内容明明为空啊,见鬼!!
那就再查看一次内容吧,事务B再次查看表内容,还是空的啊(可重复读,在事务中第一次查询为空,以后次次都是空,重复查询的结果相同)!!!可插入却报主键冲突,就是插入不进,之前的读取就是幻读。B只有提交后才能看到A插入的数据。
不可重复读侧重表达 读-读,幻读则是说 读-写,用写来证实读的是鬼影。
3.4 串读
事务A对table_student进行操作,比如读写操作,但不提交,此时事务B也想向table_student进行操作,发现所在会话陷入等待,如果A一直未提交,则B可能会等待超时。这是最严格的级别。
这就最高级别的隔离机制,它通过强制事务排序,使其步能相互冲突,从而解决了幻读问题。
简单的说:它是在每个读数据行加上了一个共享锁,在这个级别,可能导致大量的超时现象和锁竞争.