zoukankan      html  css  js  c++  java
  • 44、说一下数据库表锁和行锁吧

    表锁

    不会出现死锁,发生锁冲突几率高,并发低。

    MyISAM在执行查询语句(select)前,会自动给涉及的所有表加读锁,在执行增删改操作前,会自动给涉及的表加写锁。

    MySQL的表级锁有两种模式:表共享读锁和表独占写锁。

    读锁会阻塞写,写锁会阻塞读和写

    对MyISAM表的读操作,不会阻塞其它进程对同一表的读请求,但会阻塞对同一表的写请求。只有当 读锁释放后,才会执行其它进程的写操作。

    对MyISAM表的写操作,会阻塞其它进程对同一表的读和写操作,只有当写锁释放后,才会执行其它 进程的读写操作。

    MyISAM不适合做写为主表的引擎,因为写锁后,其它线程不能做任何操作,大量的更新会使查询很难 得到锁,从而造成永远阻塞。

    行锁

    会出现死锁,发生锁冲突几率低,并发高。

    在MySQL的InnoDB引擎支持行锁,与Oracle不同,MySQL的行锁是通过索引加载的,也就是说,行锁 是加在索引响应的行上的,要是对应的SQL语句没有走索引,则会全表扫描,行锁则无法实现,取而代 之的是表锁,此时其它事务无法对当前表进行更新或插入操作。

    行锁的实现需要注意:

    行锁必须有索引才能实现,否则会自动锁全表,那么就不是行锁了。

    两个事务不能锁同一个索引。

    insert,delete,update在事务中都会自动默认加上排它锁。

    行锁的适用场景:

    A用户消费,service层先查询该用户的账户余额,若余额足够,则进行后续的扣款操作;这种情况查询的时候应该对该记录进行加锁。

    否则,B用户在A用户查询后消费前先一步将A用户账号上的钱转走,而此时A用户已经进行了用户余额是否足够的判断,则可能会出现余额已经不足但却扣款成功的情况。

    为了避免此情况,需要在A用户操作该记录的时候进行for update加锁

  • 相关阅读:
    Javascript的调试利器:Firebug使用详解
    ASP.NET URL Rewriter 技术
    asp读取xml
    怎样提高WebService性能大数据量网络传输处理
    .net实现URL重写
    VS2005中,创建新网站ASP.NET,没有解决方案
    asp.net架构之请求处理过程:HttpModule,HttpHandler
    在应用程序级别之外使用注册为 allowDefinition='MachineToApplication' 的节是错误的
    正则表达式基础知识
    asp.net用url重写URLReWriter实现任意二级域名
  • 原文地址:https://www.cnblogs.com/crbhf/p/15145711.html
Copyright © 2011-2022 走看看