【MySQL 中,事务支持是在引擎层实现的】
数据库事务的隔离级别:
- 读取未提交:一个事务还没提交时,它做的变更就能被别的事务看到。会造成脏读,幻读和不可重复读。
- 读取已提交:推荐 & 默认 的隔离方式,一个事务提交后,它做的变更才能被别的事务看到。可以避免脏读,但是无法解决不可重复读和幻读。
- 重复读:事务读取出某一条数据的时候,就会对该数据加锁,其他事务不可以修改该数据。可以解决脏读和不可重复读的问题。但是还是会出现幻读的情况。【InnoDB 的默认事务隔离级别是可重复读】
- 串行化:最安全的SERIALIZBLE,事务一个一个执行,可以解决所有问题,但是会影响并发的效率。
脏读:读取到其他事务未提交的数据。
幻读:仅专指“新插入的行,只会出现在“当前读”的情况下。【详情】
可重复读:事务在执行期间看到的数据前后必须是一致的;
在实现上,数据库里面会创建一个视图,访问的时候以视图的逻辑结果为准。
- 在“可重复读”隔离级别下,这个视图是在事务启动时创建的,整个事务存在期间都用这个视图。
- 在“读提交”隔离级别下,这个视图是在每个 SQL 语句开始执行的时候创建的。
- 在“读未提交”隔离级别下直接返回记录上的最新值,没有视图概念;
- 在“串行化”隔离级别下直接用加锁的方式来避免并行访问。
查看当前数据库的事务隔离级别的方式:
SELECT @@tx_isolation;
设置数据库的隔离级别:
set session transaction isolation level read uncommitted;