📜  高朗 | Select 语句中的死锁和默认情况(1)

📅  最后修改于: 2023-12-03 15:12:55.921000             🧑  作者: Mango

高朗 | Select 语句中的死锁和默认情况

死锁

在高朗(MySQL)中,死锁是指两个或两个以上的事务互相等待对方释放锁资源,导致进程无法继续执行,从而出现的一种异常情况。

在进行 SQL 查询时,可能会出现死锁。 例如,有两个事务 A 和 B,其中 A 想要修改表 t1 中的行 x,而 B 想要修改表 t2 中的行 y。 如果事务 A 先获得 t1 表中的锁,同时事务 B 先获得 t2 表中的锁,那么当事务 A 尝试获取 t2 表中的锁时,就会出现死锁。

死锁的问题容易在高并发情况下出现。为了避免死锁的出现,我们可以在编码时:

  • 保证事务执行的顺序一致
  • 减少事务的等待时间
  • 减小事务的锁控制范围
  • 使用较短的事务
默认情况

在高朗中,如果没有显式指定事务模式,事务的默认模式将是 REPEATABLE READ(可重复读)模式。

在 REPEATABLE READ 模式下,一个查询所读取到的所有行都会被加上共享锁,直到该事务结束。 在该事务中,只要它不提交或回滚,它将保持该行的读取一致性,即使其他事务对该行进行了更新或删除,也不会使之前读取该行的事务产生不一致的现象。

因此,在默认情况下,如果多个事务同时读取同一行数据时,只要该行数据未被修改,多个事务读取到的数据都会是一致的。 但是,如果有一个事务修改了该行的数据,则其他事务读取到的该行数据就是不一致的。

若想修改事务的默认模式,可以使用以下语句:

SET SESSION TRANSACTION ISOLATION LEVEL <transaction_level>

其中,transaction_level 可以设置为以下几个值:

  • READ UNCOMMITTED(读未提交)
  • READ COMMITTED(读已提交)
  • REPEATABLE READ(可重复读,MySQL 默认值)
  • SERIALIZABLE(串行化)

若想在命令行中查看当前事务的模式,可以使用以下语句:

SELECT @@tx_isolation;