自增锁

自增锁,在提交前释放,并发插入高

s,x等锁,在COMMIT扣释放,并发插入需要等待

不能回滚到前面的值

insert -like:

        simple-insert:插入前就能确定插入行数语句

        bulk insert :插入前不确定插入行数的语句 replace ... select

        mixed-mode inserts:insert into t1(c1,c2) values(1,"a"),(null,"b"),(4,"c"),(null,"d")

                                            insert ...  on duplicate key update:自身扩展  (任何KEY 重复,就执行 )

 innodb_autoinc_lock_mode:

0:传统方式 ,

simple insert:传统方式

bulk insert :传统方式

对于 INSERT ... SELECT ...   些时其他事务不能插,分配的ID是连续得 ,其他事务不能插入

SQL执行完才释放自增锁

 

1.

simple insert 并发

bulk insert   传统方式

 

2.

所有自增都以并发方式

同一SQL语句自增可能不连接

row-based binlog

工作模式1: 

工作原理:

BULK INSERT:

ACQUIRE AI

INSERT ..SELECT :如果执行时间长,自增锁持有时间就长,不确定插入的记录数,只能等插入完 才自增,其他事务等待插入

AI=AI+N

RELEASE AI

 

SIMPLE INSERT : 无SQL 语句执行等待

ACQURE AI

AI=AI+N

RELESE AI

工作模式为 2时的工作原理:

FOR I=AI;I++//对BULK INSERT  也能并发插入,对单线插入变差,无益,对多线程插入是益的,自增值可能不连续的

{

ACQUIRE AI LOCK

INSERT ONE REC

AI=Ai+1

RELEAS AI LOCK

}

自增列的创建:

对于联合索引,自增列必须放在第一个列

create table jjj ( a int auto_increment,b int ,key( a,b));      // KEY(b,a)

自增锁:

   AUTO_INCREMENT PK 不能持久化,速度快

   当重起MYSQL 服务器重新计算值:

           SELECT  MAX(AUTO_INC_COL) FROM XX 基于索引查找,而不是全表扫

自增锁相关参数:

  auto_increment_increment:步长值

  auto_increment_offset:初始值

每个节点产生全局唯一自增值设置

   auto_increment_offset =1                          auto_increment_offset=2

   auto_increment_increment=10                     auto_increment_increment=10

       

       

原文地址:https://www.cnblogs.com/zengkefu/p/5698087.html