事务的四个特性:原子性、一致性、隔离性、持久性。
加锁解锁的时机
1、加写锁、不在访问数据时释放锁。避免丢失修改、但是出现脏读、不可重复读、
2、加写锁、事务结束之后释放锁。避免丢失修改、脏读但是出现不可重复读
3、加读锁 不在访问数据后释放读锁,也加写锁、事务结束后释放锁。避免不可重复读
4、加读所和加写锁 都在事务结束后释放。避免所有的不一致。如幻读
数据库隔离级别:read uncommited read commited repetead read serialization
mysql 默认的隔离级别是:repeated read

2阶段封锁协议:
每个事务分为加锁段和解锁段,加锁段中不能有解锁操作,解锁段中不能有加锁操作。
读写操作都需要获得锁,加锁的操作请求先于任何一个解锁请求。
基于时间戳的并发控制方法:
核心思想是后执行的事务后操作。读读操作 :不冲突 读写或者写读操作:可能存在冲突 写写操作:可能存在冲突。
一种简单的调度策略:TS(T)代表事务T的时间戳。WT(x) 代表最后一次对x写操作时间戳,RT(x)代表最后一次读时间戳。
(1)T读x ,TS(T) > WT(X)允许操作 并将RT(x) 重置为较大值。否则事务T回滚。
(2)T写x,TS(T) > RT(X) 允许操作,并将WT(X)重置为较大值。否则事务回滚。
(3)T写x,TS(T) > WT(X) 允许操作,并将WT(X)重置为较大值。否则事务回滚。

MVCC多版本并发控制
处理并发常用的方法是加锁。但是mysql 通过多版本并发控制来提高吞吐,从而使得select 操作读取指定的版本。
(1)应对并发事务MVCC开销小。
(2)MVCC 工作在RR 和RC 隔离级别下
(RR)在数据库表隐藏俩个字段tx_id(事务版本号) 和roll_pointer(回退到上一个版本 的指针)。每次查询前都会获取到read-view,从而获取到自己想要的版本。read-view :未提交事务id数组 + 最大事务id。这样 在查询时,对于该数据的tx_id ,若 小于最小的未提交id,说明肯定是已提交的事务,可见。
若大于最大事务id,则一定是未发生的事务。不可见。若是 在二者之间 则分为俩种情况:

  • 若tx_id 在未提交数组中,则不可见,除非是在自己的事务中当然可见。
  • 若tx_id 不在未提交数组中,可见。

Next_key 间隙锁
间隙锁本质上还是行锁。当我们使用范围条件而不是索引条件来检索数据并请求读锁或者写锁的时候,innodb会给符合条件的已有数据的索引项加锁,同时对于在这个搜索范围内,但是不存在的记录,为Gap,InnoDb也会对这个Gap加锁。

-- isolation level is Repeatable Read
-- create the table
create table t (id int primary key auto_increment, COL1 int, key idx_a(COL1));
insert into t (COL1) values(5), (10), (11), (13), (20);
select * from t;
----   ----
 id  |  COL1
----   ----
 1   |  5
 2   |  10
 3   |  11
 4   |  13
 5   |  20

-- in transaction 1
select * from t where COL1 = 13 for update;
-- in transaction 2
insert into t (COL1) values(10); -- success
insert into t (COL1) values(11); -- blocks
insert into t (COL1) values(12); -- blocks
.
.
insert into t (COL1) values(19); -- blocks
insert into t (COL1) values(20); -- success
-- in transaction 3
update t set COL1 = 11 where COL1 = 10; -- success
update t set COL1 = 12 where COL1 = 10; -- blocks
.
.
update t set COL1 = 20 where COL1 = 10; -- blocks
update t set a = 21 where a = 10; -- success
select * from t where COL1 = 13 for update; 
this sql clause will lock the range:

((11,3), (13,4)]
((13,4), (20,5)]