innodb引擎中的锁分两种
1)针对数据结构, 如链表
互斥锁
读写锁
2)针对数据表中记录
行锁
表锁
innodb中的互斥锁是依据操作系统中的spin lock自旋锁,进行一些修改而成的
修改方面:
1.当获得不到锁时, 一直在CPU高速缓冲区中读取值,避免与内存打交道,以免造成总线风暴
2.当自旋超过20us后,将线程放入wait array,待时机成熟后再唤醒,而不是放入系统的等待队列,避免上下文切换
详情请见 http://www.cnblogs.com/taek/p/4809685.html
这里主要分析下innodb的行锁
当执行sql 如 update user set name=‘xx‘ where id=1;时
innodb引擎会针对id=1这条记录加一个LOCK_REC行锁
这个锁并没有附在物理记录本身,而是存储于单独一个结构体中
typedef struct lock_struct lock_t; //利用typedef定义一个变量的类型 /** Lock struct */ struct lock_struct { trx_t* trx; /*!< transaction owning the lock */ UT_LIST_NODE_T(lock_t) trx_locks; /*!< list of the locks of the transaction */ ulint type_mode; /*!< lock type, mode, LOCK_GAP or LOCK_REC_NOT_GAP, LOCK_INSERT_INTENTION, wait flag, ORed */ hash_node_t hash; /*!< hash chain node for a record lock */ dict_index_t* index; /*!< index for a record lock */ union { lock_table_t tab_lock; /*!< table lock */ lock_rec_t rec_lock; /*!< record lock */ } un_member; /*!< lock details */ };
加锁时分加快锁和加慢锁
原文:http://www.cnblogs.com/taek/p/4935651.html