在数据库中,锁是一种用于管理并发访问的机制,用于保证数据的一致性和完整性。
根据锁的范围划分,包括以下几种:
表级锁(Table-level Lock):锁定整张表,其他事务无法同时修改表中的数据。
行级锁(Row-level Lock):只锁定特定行,其他事务可以并发地修改其他行。
页级锁(Page-level Lock):锁定表的一页数据,包含多行,适用于部分表级锁和部分行级锁的场景。
根据锁的权限性质划分,包括以下几种:
共享锁(Shared Lock):
共享锁允许多个事务同时获取锁并读取数据,但阻止其他事务获取排他锁(写锁),因此多个事务可以并发地读取同一数据。共享锁适用于读取操作,确保读取的数据是一致的,但不允许并发写入。
排他锁(Exclusive Lock):
排他锁阻止其他事务获取共享锁或排他锁,因此只有一个事务能够获取排他锁并修改数据。排他锁适用于写入操作,用于保证数据的完整性和一致性,防止并发写入导致数据不一致。
实际业务场景中,对锁的感知最多的就是数据库客户端做查询等待很久,或者做插入更新删除的时候直接报错;其次就是程序日志中报了如下的错误。
### Cause: com.mysql.cj.jdbc.exceptions.MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction; Lock wait timeout exceeded; try restarting transaction; nested exception is com.mysql.cj.jdbc.exceptions.MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction
上面的异常会报到具体的数据库层的操作位置。通常的处理方式就是如果是查询等待较久的,看看超时设置是否合理;如果是直接报错的,就排查出来具体是哪里锁住了,然后删除掉锁即可