自增锁也会导致死锁
自增锁
一个表一个自增列
auto_increment pk
select max(auto_inc_col)from t for update
在事务提交前释放
其他所在事务提交时才释放
think about
insert select
create table z(a int auto_increment,b int,primary key(a))
begin;
insert into z values(null,1) begin
insert into z values(null,2) 可以插入
如果之前插入的记录被回滚掉 自增值不会回滚
insert 。。。on duplicate key update遇到重复值会自动更新
innodb_autoinc_lock_mode= 0 1 2
0:传统模式 在sql语句执行完之后自增锁才释放
1 默认参数
simple inserts 并发:在sql语句没执行完之前就可以释放
bulk insert 传统方式
2
所有自增都以并发方式
同一sql语句自增可能不连续
row-based binlog
如果把值设置为2,需要设置为row-based binlog
myisadm与innodb的自增
innodb的自增列必须被定义为一个key
create table t(a int auto_increment,b int,key(b,a))engine=innodb; 必须被定义为key的第一个列(为什么) select max(auto_inc_col)from t for update
自增不会持久化
auto_increment_increment
auto_increment_offset
二阶段锁
读加锁 写加锁 serilizeable
非锁定的一致性读
如果是sr 右边不能执行
事务:
a:原子性 redo
c:一致性 undo
i:隔离性 lock
d:持久性 redo&undo
flat transaction:begin commit
flat gransaction with savepoints:
chained transaction: