数据库中二级封锁协议是如何解决幻影读的问题的

二级封锁协议能解决脏读问题能够理解
请问是怎么解决幻影读的

幻影读我现在的理解是:因为中间插入或者删除数据,前后两次读取数据结果不同
这个理解应该没错吧?

transection X: lock-s(a) read(a) unlock(a)
transection Y: lock-x(a) write(a) commit unlock(a)
transection X:lock-s(a) read(a) unlock(a)
前后两次读出来的数据不一样的吧,为什么看到书上写的二级封锁协议可以解决幻影读?

mysql等会用间隙锁等方式,在一个事务中锁住对应的相关影响数据范围,这样另一个事务是没法commi提交来修改数据,从而解决了幻读