首页 > 数据库 > MySQL > 正文

mysql锁表的原由有哪些

2024-07-24 12:33:38
字体:
来源:转载
供稿:网友
  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 会锁表
 
  以上是“mysql锁表的原因有哪些”这篇文章的所有内容,感谢各位的阅读!

(编辑:武林网)

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表