ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
当并发事务同时访问一个资源时,有可能导致数据不一致,因此需要一种机制来将数据访问顺序化,以保证数据库数据的一致性。锁就是其中的一种机制。 锁是在执行多线程时用于强行限制资源访问的同步机制,即用于在并发控制中保证对互斥要求的满足。 ### 锁的分类(oracle) 一、按操作划分,可分为`DML锁`、`DDL锁` 二、按锁的粒度划分,可分为[`表级锁`](http://www.hollischuang.com/archives/914)、[`行级锁`](http://www.hollischuang.com/archives/914)、[`页级锁`](http://www.hollischuang.com/archives/914)(mysql) 三、按锁级别划分,可分为[`共享锁`](http://www.hollischuang.com/archives/923)、[`排他锁`](http://www.hollischuang.com/archives/923) 四、按加锁方式划分,可分为`自动锁`、`显示锁` 五、按使用方式划分,可分为[`乐观锁`](http://www.hollischuang.com/archives/934)、[`悲观锁`](http://www.hollischuang.com/archives/934) ## 乐观锁和悲观锁 - 悲观锁:假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作 * 在查询完数据的时候就把事务锁起来,直到提交事务 * 实现方式:使用数据库中的锁机制 ![](https://img.kancloud.cn/81/d9/81d9dca6b3a2270b2e64d1e7b6817a1d_602x83.png) - 乐观锁:假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性。 * 在修改数据的时候把事务锁起来,通过version的方式来进行锁定 * 实现方式:使用version版本或者时间戳 ![](https://img.kancloud.cn/bd/df/bddf0ddbc353729a2a2772ffeb546473_753x119.png) ### 什么情况下会造成死锁 * 所谓死锁: 是指两个或两个以上的进程在执行过程中。 * 因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。 * 此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等竺的进程称为死锁进程。 * 表级锁不会产生死锁.所以解决死锁主要还是针对于最常用的InnoDB。 死锁的关键在于:两个(或以上)的Session加锁的顺序不一致。 那么对应的**解决死锁问题的关键就是**:让不同的session**加锁有次序**。 ### 死锁的解决办法 * 查出的线程杀死 kill ~~~css SELECT trx_MySQL_thread_id FROM information_schema.INNODB_TRX; ~~~ * 设置锁的超时时间 Innodb 行锁的等待时间,单位秒。可在会话级别设置,RDS 实例该参数的默认值为 50(秒)。 生产环境不推荐使用过大的 `innodb_lock_wait_timeout`参数值 该参数支持在会话级别修改,方便应用在会话级别单独设置某些特殊操作的行锁等待超时时间,如下: ~~~bash set innodb_lock_wait_timeout=1000; —设置当前会话 Innodb 行锁等待超时时间,单位秒。 ~~~