MySql的隔离性
1.读未提交的, 会产生脏读 不可重复读 幻读.
- 脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。
2.读已提交的, 会产生不可重复读 幻读.
- 不可重复读是指在事务1内,读取了一个数据,事务1还没有结束时,事务2也访问了这个数据,修改了这个数据,并提交。紧接着,事务1又读这个数据。由于事务2的修改,那么事务1两次读到的的数据可能是不一样的,因此称为是不可重复读。
3.可重复读, 会产生幻读.
- 所谓幻读,指的是当某个事务在读取某个范围内的记录时,另外一个事务又在该范围内插入了新的记录,当之前的事务再次读取该范围的记录时,会产生幻行。
- InnoDB存储引擎通过多版本并发控制(MVCC)解决了幻读的问题?
- 不可重复读重点在于update和delete,而幻读的重点在于insert。
- 写读是脏读,读写读是不可重复读,where insert where是幻读
- mysql 隔离级别为可重复读 其他事务新增的数据,看不到. sqlserver 隔离级别为可重复读 其他事务新增的数据会阻塞
4.序列化
sql语句的执行过程
- FROM子句负责把数据库的表文件加载到内存中去
- WHERE子句会把表中的数据进行过滤,取出符合条件的记录行,生成一张临时表
- GROUP BY子句会把临时表切分成若干临时表
- SELECT 的执行读取规则分为sql语句中有无GROUP BY两种情况。
- 当没有GROUP BY时,SELECT 会根据后面的字段名称对内存中的一张临时表整列读取。
- 当查询sql中有GROUP BY时,会对内存中的若干临时表分别执行SELECT,而且只取各临时表中的第一条记录,然后再形成新的临时表。这就决定了查询sql使用GROUP BY的场景下,SELECT后面跟的一般是参与分组的字段和聚合函数,否则查询出的数据要视情况而定。另外聚合函数中的字段可以是表中的任意字段,需要注意的是聚合函数会自动忽略空值。
- HAVING子句对临时表中的数据再次过滤.所以说column AS otherName ,otherName这样的字段在WHERE后不能使用,但在HAVING 后可以使用。但HAVING的后使用的字段只能是SELECT 后的字段,SELECT后没有的字段HAVING之后不能使用。
- ORDER BY子句对临时表进行排序
- LIMIT子句