一. 事务的几种读方式:
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);二,默认采用行级锁。加锁可以保证事务的一致性,可谓是有人(锁)的地方,就有江湖(事务);