wuker

mysql高级

一、Innodb和myisam区别

  Innodb Myisam
支持事务 支持 不支持
锁单位 行级锁 表级锁
全文索引 不支持 支持
支持外键 支持 不支持

 

 

 

 


二、事务特性
  1、原子性:要么全成功,要么全失败,其中一个错误那就回滚
  2、一致性:保证原子性,保证最后数据没有异常
  3、隔离性:事务在未提交之前,事物之间是互相隔离的
  4、持久性:执行完之后数据会永久保存

三、事务隔离特性,默认是可重复读
脏读:事务A读了事务B数据,事务B回滚,A读的数据称为脏数据
幻读:事务A更改了所有数据,此时事务B插入一条数据,A以为看错了,产生幻觉
不可重复读:事务B在多次读取一条数据,此时事务A更改了这条数据,导致事务B多次读取数据不一致

事务隔离级别       脏读        幻读      不可重复读
读未提交(read-uncommitted)       是        是         是
不可重复读(read-committed)       否        是         是
可重复读(repeatable-read)       否        是         否
串行化(serializable)       否        否         否

 

 









四、锁机制
  1、按照锁的互斥达成度分为:
    共享锁:读取数据时加S锁,之间不互斥
    排他锁:修改数据时加X锁,与任何锁互斥
  2、按照锁颗粒度分为:
    表锁
      意向锁:意向锁分为意向共享锁和意向排他锁
        例如:
          意向共享锁:select ... lock in share mode;
          意向排他锁:select ... for update;

      自增锁:自增值时,如果A,B事务同事插入,A先进入的话,必须等A执行完B才可以,否则B会被阻塞
        例如:insert into tabel1 (id,value) values(2,1111)
    行锁
      间隙锁:它封锁索引记录中的间隔,阻止其他事务对该范围操作
        例如:select * from table1 where id between 8 and 15 for update; 
      记录锁:命中索引,阻止其他事务对这行操作
        例如:select id=1 from table1 for update;
      插入意向锁:属于间隙锁的一种特殊情况,专门针对insert操作。指多个事务,在同一个索引,同一个范围区间插入记录时,如果插入的位置不冲突,不会阻塞彼此
        例如:事务A:insert into table1(id,value) values(1,'v1')  事务B:insert into table2(id,value) values(2,'v2') ;2个事务互不排斥  
      临键锁:是记录锁与间隙锁的组合,它的封锁范围,既包含索引记录,又包含索引区间
        例如:事务A执行,未提交:select * from table1 where id = 20 for update;事务B执行:insert into table1(value) values('vlock');会阻塞。

 



posted on   wuker  阅读(85)  评论(0编辑  收藏  举报

努力加载评论中...
点击右上角即可分享
微信分享提示