mysql有一个autocommit参数,默认是on,他的作用是每一条单独的查询都是一个事务,并且自动开始,自动提交(执行完以后就自动结束了,如果你要使用select for update,而不手动调用 start transaction,这个for update的行锁机制等于没用,因为,所有事务隔离级别和锁机制,其行锁在自动提交后就释放了。

READ-UNCOMMITTED隔离级别

当两个事务同时进行时,即使事务没有提交,所做的修改也会对事务内的查询做出影响,这种级别显然很不安全。但是在表对某行进行修改时,会对该行加上行共享锁。

READ-COMMITTED事务隔离级别

只有在事务提交后,才会对另一个事务产生影响,并且在对表进行修改时,会对表数据行加上行共享锁。

  • 虚读:在事务1两次读取同一记录的过程中,事务2对该记录进行了修改,从而事务1第二次读到了不一样的记录。
  • 幻读:事务1在两次查询的过程中,事务2对该表进行了插入、删除操作,从而事务1第二次查询的结果发生了变化。

REPEATABLE-READ事务隔离级别

当两个事务同时进行时,其中一个事务修改数据对另一个事务不会造成影响,即使修改的事务已经提交也不会对另一个事务造成影响。
在事务中对某条记录修改,会对记录加上行共享锁,直到事务结束才会释放。

幻读

可重复读隔离级别下,当用户读取一定范围数据时,如果另一个事务插入了新行,则当用户再次读取时,会有该条新数据。innodb通过MVCC+next-key locks解决幻读问题。

SERIALIZABLE隔离级别

在进行查询时就会对表或行加上共享锁,其他事务对该表将只能进行读操作,而不能进行写操作。