平台怎么推广技巧,上海有什么seo公司,wordpress页码数量,无锡市建设局网站联系电话行锁 : 对表中行记录的锁
MySQL 的行锁 : 由各个引擎自己实现MyISAM 不支持行锁InnoDB 支持行锁
两阶段锁协议 : 行锁是在需要时才加上#xff0c;要等到事务结束才释放
例子 : id 是表 t 的主键的
B 的 update 会阻塞#xff0c;直到 A 执行 commit 后#xff0c;B 才能…行锁 : 对表中行记录的锁
MySQL 的行锁 : 由各个引擎自己实现MyISAM 不支持行锁InnoDB 支持行锁
两阶段锁协议 : 行锁是在需要时才加上要等到事务结束才释放
例子 : id 是表 t 的主键的
B 的 update 会阻塞直到 A 执行 commit 后B 才能继续执行 事务中要锁多个行要把最可能造成锁冲突、最可能影响并发度的锁尽量往后放
例子 : 电影票交易
考虑到影院账户的余额最容易冲突的事务中的操作顺序 : 3 - 1 - 2
从顾客 A 账户余额中扣除电影票价 : update给影院 B 的账户余额增加这张电影票价 : update记录一条交易日志 : insert
死锁
死锁 : 不同线程出现循环资源依赖涉及的线程都等待别的线程释放资源时就会导致这几个线程都进入无限等待的状态
死锁例子 :
A 等待B 释放 id2 行锁而 B 等待 A 释放 id1 行锁A 和 B 都互相等待对方的资源释放就进入了死锁状态 死锁策略 :
设置等待超时 : innodb_lock_wait_timeout (默认 : 50s , 不易调整)开启死锁检测当出现死锁主动回滚死锁中的某个事务让其他 事务继续执行 : innodb_deadlock_detect on2
主动死锁检测 : 能快速发现并进行处理但要耗费 CPU
死锁检测耗费 CPU 解决方案 :
确保该业务一定不会出现死锁能临时关掉死锁检测 (风险)
出现死锁就回滚通过业务重试就没问题对业务无损关掉死锁检测 : 会出现大量的超时对业务有损
控制并发度 : 并发控制在同行同时最多只有 10 个线程在更新死锁检测的成本很低
考虑在中间件实现修改 MySQL 源码 : 对相同行的更新在进入引擎之前排队 , 避免大量的死锁检测
将一行改成逻辑多行来减少锁冲突
将影院的账户总额拆分成 10 个记录的值的总和。每次修改账户就随机选其中一条记录修改每次冲突概率变成 1/10减少锁等待个数减少死锁检测的 CPU 消耗该方案要根据业务逻辑做详细设计代码要有特殊处理