2021-01-18 20:04:57
标准SQL规范定义了四种事务隔离级别,具体如下:
未授权读取(Read Uncommitted)
该级别允许事务读取其他未提交事务修改的数据,即存在“脏读”现象。若一个事务正在修改某行数据,其他事务可读取该行未提交的中间状态,但禁止两个事务同时修改同一行数据。此级别通过“排他写锁”实现,并发性能最高,但数据一致性风险最大。
授权读取(Read Committed)
此级别禁止脏读,但允许“不可重复读”。事务只能读取已提交的数据,未提交的写操作会阻塞其他事务访问该行。例如,事务A两次读取同一行数据时,若事务B在此期间提交了对该行的修改,则A的两次读取结果可能不同。该级别通过“瞬间共享读锁”和“排他写锁”实现,是多数数据库的默认设置,平衡了并发性与数据一致性。
可重复读取(Repeatable Read)
该级别禁止脏读和不可重复读,但可能发生“幻读”。事务在执行期间多次读取同一数据范围时,结果始终一致,即使其他事务已提交修改。此级别通过“共享读锁”和“排他写锁”实现,写事务会阻塞其他所有事务,读事务仅阻塞写事务。例如,事务A查询某范围数据时,事务B无法插入新数据到该范围,但可能修改已存在的数据(取决于具体实现)。
序列化(Serializable)
最高隔离级别,要求事务完全串行执行,禁止并发操作。通过“行级锁”结合其他机制(如范围锁)防止幻读,确保事务执行期间新插入的数据不会被其他事务访问。此级别数据一致性最强,但并发性能最低,仅适用于对数据完整性要求极高的场景。
隔离级别选择建议
多数应用可优先采用Read Committed,其能避免脏读且并发性能较好。若需更高一致性,可选用Repeatable Read;对极端严格场景(如金融交易),可考虑Serializable。实际应用中,可通过悲观锁或乐观锁机制补充控制不可重复读、幻读等问题。