隔离性其实是比较复杂的一种特性,在标准的SQL中定义四种隔离级别,每一种隔离级别都规定了一个事务中所做的修改,哪些在事务内核事务间是可见的,哪些是不可见的,较低级别的隔离通常可以执行更高的并发,系统的开销也是最少的。(每种存储引擎实现的隔离级别不尽相同,具体细节可以查看相关的文档)
下面我们来理解一下这四种隔离级别:
READ UNCOMMITTED(未提交读)
在这个级别中,事务中的修改,即使没有提交,对于其它事务来说也是可见的。最低级别。事务可以读取未提交的数据,这也被称作脏读,一般很少用这个级别。READ COMMITE(提交读)
这一级别满足隔离性的简单定义:一个事务从开始到提交之前,所做的任何修改对其它事务来说是不可见的。这个级别也被称作不可重复读,因为两次执行相同的查询,可能会得到不一样的结果。REPEATABLE READ(可重复读)
这一级别解决了脏读问题,并且保证同一事务中多次读取同样记录的结果是一致的,但是在理论上还是无法解决幻读问题(回头仔细来说幻读的解决)。MySQL默认是这个级别SERIALIZABLE(可串行化)
最高隔离级别,强制事务串行,避免了幻读,简单来说就是每行数据加锁,所以有可能导致超时和锁资源争用问题,一般也很少使用。