一.  事务的几种读方式:

  1)脏读:当一个事务读取到另外一个事务修改但未提交的数据时,就可能发生脏读。

     事务1修改了用户表数据还未提交,这时事务2进行了查询,查询到了这条未提交数据,当事务1提交之后,这时候事务2查询的数据就是不正确的了。

  2)不可重复读:当执行SELECT 操作时没有获得读锁或者SELECT操作执行完后马上释放了读锁; 另外一个事务对数据进行了更新,读到了不同的结果。

    事务1读取的时候事务2进行了数据修改,事务1未获取读锁或者读完之后马上释放了读锁。事务2修改完成后,事务1再次读取的数据跟原来的就不相同了。

3)幻读:是''不可重复读''的一种特殊场景:当事务1两次执行''SELECT ... WHERE''检索一定范围内数据的操作中间,事务2在这个表中创建了(如[[INSERT]])了一行新数据,这条新数据正好满足事务1的“WHERE”子句。

二.  它们的区别

脏读:指读到了其他事务未提交的数据.
不可重复读: 读到了其他事务已提交的数据(update).

不可重复读与幻读都是读到其他事务已提交的数据,但是它们针对点不同.
不可重复读:update.
幻读:delete,insert.

三.  MySQL中的四种事务隔离级别

  1)未提交读:是最低的隔离级别,在这种隔离级别下,如果一个事务已经开始写数据,则另外一个事务则不允许同时进行写操作,但允许其他事务读此行数据。

  2)已提交读:读取数据的事务允许其他事务继续访问该行数据,但是未提交的写事务将会禁止其他事务访问该行,会对该写锁一直保持直到到事务提交

  3)可串行化:是高的隔离级别,它求在选定对象上的读锁和写锁保持直到事务结束后才能释放,所以能防住上诉所有问题,但因为是串行化的,所以效率较低.

  4)可重复读:是介于已提交读和可串行化之间的一种隔离级别。

四.  mysql行锁

   1)行锁的劣势:开销大;加锁慢;会出现死锁

    2)行锁的优势:锁的粒度小,发生锁冲突的概率低;处理并发的能力强

    3)加锁的方式:自动加锁。对于UPDATE、DELETE和INSERT语句,InnoDB会自动给涉及数据集加排他锁;对于普通SELECT语句,InnoDB不会加任何锁;当然我们也可以显示的加锁:

共享锁:select * from tableName where … + lock in share more

排他锁:select * from tableName where … + for update

InnoDB和MyISAM的最大不同点有两个:一,InnoDB支持事务(transaction);二,默认采用行级锁。加锁可以保证事务的一致性,可谓是有人(锁)的地方,就有江湖(事务);