mysql事务中隔离级别和锁

mysql的innob引擎支持标准sql事务的四个级别

REPEATABLE READ(默认)
     | READ COMMITTED
     | READ UNCOMMITTED
     | SERIALIZABLE

默认是可以重复读,以repeatable_read 为例,默认情况它使用了Consistent Nonlocking Reads,其实就是多版本快照方式,一个repeatable_read 事务里面,第一次读取从数据库取,然后这个数据放入快照里面,后面的读取都是从快照里面取,这样虽然保证了一个事务里面读取的数据的一致性,但是会出现其他事务已经改了数据库里面的值,而当前事务却还在使用老的数据。如果对于数据的同步要求很高的话,可以在sql上面使用锁,

select ... lock in share mode; //共享锁,可同时读,不能同时写
select ... for update; // 排他锁,独占

但是用锁,肯定影响性能,至少mysql没有使用锁来实现repeatable-read隔离级别。

如果是SERIALIZABLE级别,mysql倒是会自动的将select转化为select ... LOCK IN SHARE MODE,即使用了共享锁。

你可能感兴趣的:(锁,隔离级别,MySQL事务)