数据库隔离级别

细细梳理一下DB的隔离级别。

1.Read Uncomitted(未提交读)

在此级别中,事务中的级别即便是没有提交,对其他事务也都是可见的。也就是说事务可以读取到未提交的数据,这也是俗称的“脏读”。这个是比较危险的,而且性能上不比其他严格级别的好多少。

2.Read Committed(提交读)

顾名思义,该事务下,一个事务只有当提交之后,其所做的修改才能被另外的事务看见。这里又会产生另外一个问题,事务前后查询的数据是不一样的,(即“不可重复读”),大多数数据库默认是这个级别。因为在一个事务中前后两次查询同一数据,并且对其结果有一致性要求的需求极少,所以一般情况下是安全的。

3.Repeatalbe Read(可重复读)

该级别保证了同一事务中多次读取同一记录的结果是一致的。但是理论上,该级别无法解决另外一个”幻读“问题。当一个事务查询ID 0~100的记录,此时另外一个事务插入ID为99的记录,那边在插入事务前后的查询会不一致。(此问题和不可重复读类似,前者是因为新增或删除,后者是因为修改)

4.Serializable(可串行化)

最高的隔离级别。所有事务串行执行,会对操作的每一行数据都加上锁,会导致性能耗费在超时和锁争抢上。只有在非常需要确保数据的一致性并且可以接受没有并发的情况下,才应该选择此级别。

Mysql-查看事务级别

<pre><code>SELECT @@global.tx_isolation;
SELECT @@session.tx_isolation;
SELECT @@tx_isolation;</pre></code>

默认的行为(不带session和global)是为下一个(未开始)事务设置隔离级别。如果使用Global关键字,语句在全局对从那点开始创建的所有新连接(除了不存在的连接)设置默认事务级别。需要Super权限来做这个。使用Session 关键字为将来在当前连接上执行的事务设置默认事务级别。 任何客户端都能自由改变会话隔离级别(甚至在事务的中间),或者为下一个事务设置隔离级别。