1级封锁协议:事务T在修改数据R之前必须先对其加X锁,直到事务T结束才释放。

    • 事务结束包括正常结束(COMMIT)和非正常结束(ROLLBACK) 。
    • 1级封锁协议可防止丢失更新,并保证事务T是可恢复的。
    • 如果仅仅是读取数据不对其进行修改,是不需要加读锁的,那么不需要加读锁的事务就可以直接读取数据,所以它不能防止不可重复读脏读

    2级封锁协议:1级封锁协议+事务T在读取数据之前必须先加S锁,读完后立即释放S锁。2级封锁协议可以防止丢失更新脏读,但不能防止不可重复读

    3级封锁协议:1级封锁协议+事务T在读取数据之前必须先加S锁,直到事务T结束才释放S锁。3级封锁协议可防止丢失更新脏读不可重复读

    事务的4种隔离级别:

    • 读未提交(READ-UNCOMMITTED):可读取其他事务未提交的数据,易引发脏读
    • 读已提交(READ COMMITTED):读其他事务已提交数据,防止脏读
    • 可重复读(REPEATABLE READ):MySQL默认级别。保证一个事务内多次连续读取数据的一致,但不能防止幻读,InnoDB通过多版本并发控制(MVCC)机制解决了幻读问题
    • 串行化(SERIALIZABLE):事务安全最高的隔离级别,可防止死锁,但会严重影响并发性能

    image.png