mysql锁表

mysql锁表的原因是什么

在mysql中,锁表的原因是一个程序执行了对表的insert、update或者delete操作还未commite时,另一个程序也对同一个表进行相同的操作,则此时会发生资源正忙的异常,也就是锁表。

img

本教程操作环境:windows10系统、mysql8.0.22版本、Dell G3电脑。

mysql锁表的原因是什么

锁是计算机协调多个进程或线程并发访问某一资源的机制。

在数据库中,除传统的计算资源(如CPU、RAM、I/O等)的争用以外,数据也是一种供许多用户共享的资源。

如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。

从这个角度来说,锁对数据库而言显得尤其重要,也更加复杂。

锁表的原因

1、锁表发生在insert update 、delete 中

2、锁表的原理是 数据库使用独占式封锁机制,当执行上面的语句时,对表进行锁住,直到发生commite 或者 回滚 或者退出数据库用户

第一、 A程序执行了对 tableA 的 insert ,并还未 commite时,B程序也对tableA 进行insert 则此时会发生资源正忙的异常 就是锁表

第二、锁表常发生于并发而不是并行(并行时,一个线程操作数据库时,另一个线程是不能操作数据库的,cpu 和i/o 分配原则)

3、减少锁表的概率:

减少insert 、update 、delete 语句执行 到 commite 之间的时间。

具体点批量执行改为单个执行、优化sql自身的非执行速度 如果异常对事物进行回滚

示例如下:

使用 update

假设kid 是表table 的 一个索引字段 且值不唯一:

1):如果kid 有多个值为12的记录那么:

update table set name=’feie’ where kid=12; #会锁表

2):如果kid有唯一的值为1的记录那么:

update table set name=’feie’ where kid=1; #不会锁

总结:用索引字段做为条件进行修改时, 是否表锁的取决于这个索引字段能否确定记录唯一,当索引值对应记录不唯一,会进行锁表,相反则行锁。

使用 delete

如果有两个delete : kid1 与 kid2 是索引字段

1):语句1 delete from table where kid1=1 and kid2=2;

2):语句2 delete from table where kid1=1 and kid2=3;

# 这样的两个delete 是不会锁表的

1):语句1 delete from table where kid1=1 and kid2=2;

2):语句2 delete from table where kid1=1 ;

# 这样的两个delete 会锁表

总结:同一个表,如果进行删除操作时,尽量让删除条件统一,否则会相互影响造成锁表(这里的条件是两个delete语句同时执行时的where条件)

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
MySQL故障注入是指攻击者通过恶意构造的SQL语句来利用MySQL机制造成数据库的故障或停止服务的情况。在MySQL中,是通过或行级来实现的。 MySQL定粒度最大的一种,它对当前操作的整张进行加。这种的实现相对简单,资源消耗也较少,加速度较快,并且不容易出现死。MyISAM和InnoDB存储引擎都支持。 行级MySQL定粒度最小的一种,它只针对当前操作的行进行加。行级可以大大减少数据库操作的冲突,提高并发度。但是,行级的加开销较大,加速度较慢,并且容易出现死。 在故障注入中,攻击者利用恶意构造的SQL语句,通过触发冲突或死的方式来影响数据库的正常运行。例如,攻击者可以故意向一个中插入大量数据,导致其他事务无法获取到该的写,从而导致数据库的写操作被阻塞或超时。 为了防止故障注入,可以采取以下措施: 1. 使用合理的数据库设计和索引优化,减少的竞争。 2. 避免长时间的事务和复杂的查询语句,尽量降低的持有时间。 3. 合理设置事务隔离级别,根据业务需求选择合适的隔离级别。 4. 监控数据库的等待情况,及时发现并解决潜在的问题。 5. 对于不必要的,可以考虑使用行级来替代,提高并发度和性能。 总之,MySQL故障注入是一种利用MySQL机制来造成数据库故障或停止服务的攻击方式。为了防止这种攻击,需要合理设计数据库架构,优化查询语句,并合理设置事务隔离级别,以减少冲突和死的发生。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Mysql数据库总结](https://blog.csdn.net/jaredray/article/details/124080045)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值