InnoDB和MyISAM是Mysql的两种存储引擎,所谓存储引擎,就是数据文件的组织方式
,其最大的不同,就是数据存储的结构和方式不一样。InnoDB采用聚簇索引来存储数据,MyISAM采用非聚簇索引。
也就是说,InnoDB的索引和数据是关联在一起的,在B+树的根节点,而MyISAM的key-value存的是key和地址指针,其真正的文件存在于其他位置。
表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。
行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking);InnoDB存储引擎既支持行级锁(row-level locking),也支持表级锁,但默认情况下是采用行级锁。
对MyISAM表的读操作,不会阻塞其他用户对同一表的读请求,但会阻塞对同一表的写请求
对 MyISAM表的写操作,则会阻塞其他用户对同一表的读和写操作
InnoDB存储引擎既支持行级锁(row-level locking),也支持表级锁,但默认情况下是采用行级锁。
InnoDB行锁是通过索引实现的,InnoDB这种行锁实现特点意味着:只有通过索引条件检索数据,InnoDB才使用行级锁,否则,InnoDB将使用表锁!
mysql InnoDB引擎默认的修改数据语句:
update,delete,insert都会自动给涉及到的数据加上排他锁,
select语句默认不会加任何锁类型。
又称读锁。
允许一个事务去读一行,阻止其他事务获得相同数据集的排他锁。
若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其他事务只能再对A加S锁,而不能加X锁,直到T释放A上的S锁。这保证了其他事务可以读A,但在T释放A上的S锁之前不能对A做任何修改。
允许获取排他锁的事务更新数据,阻止其他事务取得相同的数据集共享读锁和排他写锁。若事务T对数据对象A加上X锁,事务T可以读A也可以修改A,其他事务不能再对A加任何锁,直到T释放A上的锁。
mysql InnoDB引擎默认的修改数据语句:update,delete,insert都会自动给涉及到的数据加上排他锁,select语句默认不会加任何锁类型,
如果加排他锁可以使用select …for update(不希望别的事务修改数据,其他的事务职能用不带锁的select来查询)
加共享锁可以使用select … lock in share mode语句(不希望别的数据修改数据,其他事务可以用 select … lock in share mode和select不带任何锁来查询数据)