事务并发引发的问题
在线购物平台、商品、库存
隔离级别
1.读未提交
2.读已提交
3.可重复读
4.串行化
脏读:读到未提交的数据
不可重复读:一个事务中读到不同的结果(读的过程中,别的事务提交了)
幻读:
查询隔离级别
select @@tx_isolation;
//设置read uncommitted级别:
set session transaction isolation level read uncommitted;
//事务A
start TRANSACTION;
select * from account
update account set money = 16 where id = 1;
//事务B
start TRANSACTION;
select * from account;
事务B看到了事务A中修改但未提交的数据
//设置read committed级别:
set session transaction isolation level read committed;
事务A Commit
出现了不可重复读的问题
//设置repeatable read级别:
set session transaction isolation level repeatable read;
可以解决重复读的问题,但是会出现幻读的问题
//设置serializable级别:
set session transaction isolation level serializable;
串行化:有事务在查看的时候,别的事务无法做新增或修改操作
innodb锁的原理
1.共享锁
S锁,读锁
又称读锁,若事务T对数据对象A加上S锁,则其他事务可以读A但不能修改A,其他事务只能再对A加S锁,而不能加X锁,直到T释放A上的S锁。这保证了其他事务可以读A,但在T释放A上的S锁之前不能对A做任何修改。
2.排它锁
X锁,写锁
若事务T对数据对象A加上X锁,事务T可以读A也可以修改A,其他事务不能再对A加任何锁,直到T释放A上的锁。这保证了其他事务在T释放A上的锁之前不能再读取和修改A。
3.意向共享锁
IS
4.意向排它锁
IX
5.自增锁
开事务,新增,再回滚,id也会被算上(比如新增的ID为3,4,5,又回滚了,那么下次id开始就是6)
6.临键锁
> < between
左开又闭
7.间隙锁
没有匹配记录,会降级为间隙锁
8.记录锁
innodb上的行锁,锁的是什么?
行锁就是给索引上的索引项加锁。
锁和隔离级别的关系
幻读:临键锁
不可重复读:S锁,共享锁
脏读:X锁,排它锁