锁的类型
- 共享锁(S锁) 允许事务读一行数据
- 排他锁(X锁) 允许事务删除或者更新一条数据
只要一行数据上了排他锁,那么就不能给他加共享锁,其实也很好理解,只要一个数据加了排他锁,那么这条数据其实就是不可读的状态。
一致性非锁定读
一致性非锁定读是指Innodb存储引擎通过行多版本控制的方式来读取当前执行时间数据库中行的数据,如果读取的是正在delete和update操作,这时读取操作不会因此去等待行上锁的释放,其实,他读取的是行的一个快照数据。
在事务隔离级别为读已提交和可重复读时,数据库就使用的是一致性非锁定读,在读已提交的隔离级别下,读的总是被锁定行的最新一份快照数据,对可重复读的隔离级别下,读的总是事务开始时的行数据版本。
一致性锁定读
在某种情况下,数据库要显示的对数据库读写操作进行加锁控制以保证数据逻辑的一致性,这就要求数据库支持加锁语句,innodb对于select语句支持两种一致性的锁定读
select --- for update
select ---- lock in share mode
场景:对金额操作,可以使用for update,那么这时其他的事务就无法修改这条数据,进行阻塞。在一致性非锁定读的情况下可以使用一致性锁定读的语句,他们并不是互斥的。
幻读问题
Innodb的可重复读可以解决幻读问题,但是oracle因为是读已提交存在幻读问题,解决幻读可以通过间隙锁,或者oracle升级他的隔离级别为服务串行化。