精华内容
下载资源
问答
  • MySQL行锁和表锁

    2021-03-22 21:34:19
    文章目录MySQL行锁和表锁表锁行锁注意事项间隙锁总结 MySQL行锁和表锁 MySQL常用引擎有MyISAM和InnoDB,而InnoDB是mysql默认的引擎。MyISAM不支持行锁,而InnoDB支持行锁和表锁。 MyISAM在执行select时,会自动给...

    MySQL行锁和表锁

    MySQL常用引擎有MyISAM和InnoDB,而InnoDB是mysql默认的引擎。MyISAM不支持行锁,而InnoDB支持行锁和表锁。

    MyISAM在执行select时,会自动给所有涉及的表加读锁,在执行update、delete、insert前,会给所有涉及的表加写锁,无需用户操作。
    读锁:

    select  math from zje where math>60 lock in share mode

    写锁:

    select math from zje where math >60 for update

    表锁

    适用表锁不会出现死锁,发生锁冲突的几率高,并发量低。
    MySQL的表锁表现形式:

    • 表共享读锁(对MyISAM表的读操作,不会阻塞其他线程对同一表的读请求,但无法进行写操作,除非读锁被释放)
    • 表独占写锁(对MyISAM表的写操作,会阻塞其他线程对同一表的读写操作,除非写锁别释放)

    MyISAM不适合作为主表的引擎,因为在进行写操作时,其他的线程全被阻塞了。

    行锁

    MySQL的行锁加载在索引响应的行上的,如果对应的sql语句没有适用索引的话,则会进行全盘扫描,无法适用行锁,而是适用表锁,其他事务无法对当前表进行更新或插入操作。
    如果如上所示在一条select后面加上for update 查询的数据会加上一条排他锁,其他事务可以进行读操作,但不能进行写操作。

    注意事项

    • 行锁必须是通过索引来实现的,否则的话就是表锁
    • 不同的事务不能锁住相同的索引
    • 事务中如果有写操作(update、delete、insert),会自动加上排他锁

    间隙锁

    当适用范围查询检索数据时,如果请求了共享锁或者排他锁,InnoDB会给符合条件的已有数据记录的索引项加锁;对于键值在条件范围内并不存在的记录,叫做间隙InnoDB也会对这个"间隙"加锁,这种锁机制就是所谓的间隙锁

    总结

    • 尽量控制事务大小,减少锁定资源量和时间长度
    • 合理设计索引,尽量缩小锁的范围
    • 尽可能减少索引条件,避免间隙锁
    • 尽可能让所有数据检索都通过索引来完成,避免无索引行锁升级为表锁
    展开全文
  • InnoDB行锁和表锁的分析InnoDB行锁是通过给索引上的索引项加锁来实现的,这一点MySQL与Oracle不同,后者是通过在数据块中对相应数据行加锁来实现的。InnoDB这种行锁实现特点意味着:只有通过索引条件检索数据,...

    InnoDB行锁和表锁的分析

    InnoDB行锁是通过给索引上的索引项加锁来实现的,这一点MySQL与Oracle不同,后者是通过在数据块中对相应数据行加锁来实现的。

    InnoDB这种行锁实现特点意味着:只有通过索引条件检索数据,InnoDB才使用行级锁,否则,InnoDB将使用表锁!

    在实际应用中,要特别注意InnoDB行锁的这一特性,不然的话,可能导致大量的锁冲突,从而影响并发性能。

    下面通过一些实际例子来加以说明。

    (1)在不通过索引条件查询的时候,InnoDB使用的是表锁,而不是行锁

    在如表20-9所示的例子中,开始tab_no_index表没有索引:

    表20-9         InnoDB存储引擎的表在不使用索引时使用表锁例子

    session_1

    mysql>setautocommit=0;

    Query OK, 0 rows affected (0.00 sec)

    mysql>select * from tab_no_index whereid=1;

    +------+------+

    | id   | name |

    +------+------+

    | 1    | 1    |

    +------+------+

    1 row in set (0.00 sec)

    session_2

    mysql>setautocommit=0;

    Query OK, 0 rows affected (0.00 sec)

    mysql>select * from tab_no_index whereid=2;

    +------+------+

    | id   | name |

    +------+------+

    | 2    | 2    |

    +------+------+

    1 row in set (0.00 sec)

    session_1:

    mysql>select * from tab_no_index whereid=1for update;

    +------+------+

    | id   | name |

    +------+------+

    | 1    | 1    |

    +------+------+

    1

    session_2:

    mysql>select * from tab_no_index whereid=2for update;

    ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

    在如表20-9所示的例子中,看起来session_1只给一行加了排他锁,但session_2在请求其他行的排他锁时,却出现了锁等待!原因就是在没有索引的情况下,InnoDB只能使用表锁。当我们给其增加一个索引后,InnoDB就只锁定了符合条件的行,如表20-10所示。

    创建tab_with_index表,id字段有普通索引:

    mysql>create table tab_with_index(id int,name varchar(10))engine=innodb;

    Query OK, 0 rows affected (0.15 sec)

    mysql>alter table tab_with_index add index id(id);

    Query OK, 4 rows affected (0.24 sec)

    Records: 4  Duplicates: 0  Warnings: 0

    表20-10    InnoDB存储引擎的表在使用索引时使用行锁例子

    session_1

    mysql>setautocommit=0;

    Query OK, 0 rows affected (0.00 sec)

    mysql>select * from tab_with_index whereid=1;

    +------+------+

    | id   | name |

    +------+------+

    | 1    | 1    |

    +------+------+

    1 row in set (0.00 sec)

    session_2

    mysql>setautocommit=0;

    Query OK, 0 rows affected (0.00 sec)

    mysql>select * from tab_with_index whereid=2;

    +------+------+

    | id   | name |

    +------+------+

    | 2    | 2    |

    +------+------+

    1 row in set (0.00 sec)

    session_1

    mysql>select * from tab_with_index whereid=1for update;

    +------+------+

    | id   | name |

    +------+------+

    | 1    | 1    |

    +------+------+

    1 row in set (0.00 sec)

    session_2

    mysql>select * from tab_with_index whereid=2for update;

    +------+------+

    | id   | name |

    +------+------+

    | 2    | 2    |

    +------+------+

    1 row in set (0.00 sec)

    (2)由于MySQL的行锁是针对索引加的锁,不是针对记录加的锁,所以虽然是访问不同行的记录,但是如果是使用相同的索引键,是会出现锁冲突的。应用设计的时候要注意这一点。

    在如表20-11所示的例子中,表tab_with_index的id字段有索引,name字段没有索引:

    mysql>alter table tab_with_index drop index name;

    Query OK, 4 rows affected (0.22 sec)

    Records: 4  Duplicates: 0  Warnings: 0

    mysql>insert into tab_with_index  values(1,'4');

    Query OK, 1 row affected (0.00 sec)

    mysql>select * from tab_with_index whereid=1;

    +------+------+

    | id   | name |

    +------+------+

    | 1    | 1    |

    | 1    | 4    |

    +------+------+

    2 rows in set (0.00 sec)

    表20-11    InnoDB存储引擎使用相同索引键的阻塞例子

    session_1

    mysql>setautocommit=0;

    Query OK, 0 rows affected (0.00 sec)

    session_2

    mysql>setautocommit=0;

    Query OK, 0 rows affected (0.00 sec)

    session_1

    mysql>select * from tab_with_index whereid=1andname='1'for update;

    +------+------+

    | id   | name |

    +------+------+

    | 1    | 1    |

    +------+------+

    1 row in set (0.00 sec)

    虽然session_2访问的是和session_1不同的记录,但是因为使用了相同的索引,所以需要等待锁:

    mysql>select * from tab_with_index whereid=1andname='4'for update;

    等待

    (3)当表有多个索引的时候,不同的事务可以使用不同的索引锁定不同的行,另外,不论是使用主键索引、唯一索引或普通索引,InnoDB都会使用行锁来对数据加锁。

    在如表20-12所示的例子中,表tab_with_index的id字段有主键索引,name字段有普通索引:

    mysql>alter table tab_with_index add index name(name);

    Query OK, 5 rows affected (0.23 sec)

    Records: 5  Duplicates: 0  Warnings: 0

    表20-12    InnoDB存储引擎的表使用不同索引的阻塞例子

    session_1  ·

    mysql>setautocommit=0;

    Query OK, 0 rows affected (0.00 sec)

    session_2

    mysql>setautocommit=0;

    Query OK, 0 rows affected (0.00 sec)

    session_1

    mysql>select * from tab_with_index whereid=1for update;

    +------+------+

    | id   | name |

    +------+------+

    | 1    | 1    |

    | 1    | 4    |

    +------+------+

    2 rows in set (0.00 sec)

    Session_2使用name的索引访问记录,因为记录没有被索引,所以可以获得锁:

    mysql>select * from tab_with_index wherename='2'for update;

    +------+------+

    | id   | name |

    +------+------+

    | 2    | 2    |

    +------+------+

    1 row in set (0.00 sec)

    由于访问的记录已经被session_1锁定,所以等待获得锁。:

    mysql>select * from tab_with_index wherename='4'for update;

    (4)即便在条件中使用了索引字段,但是否使用索引来检索数据是由MySQL通过判断不同执行计划的代价来决定的,如果MySQL认为全表扫描效率更高,比如对一些很小的表,它就不会使用索引,这种情况下InnoDB将使用表锁,而不是行锁。因此,在分析锁冲突时,别忘了检查SQL的执行计划,以确认是否真正使用了索引。关于MySQL在什么情况下不使用索引的详细讨论,参见本章“索引问题”一节的介绍。

    在下面的例子中,检索值的数据类型与索引字段不同,虽然MySQL能够进行数据类型转换,但却不会使用索引,从而导致InnoDB使用表锁。通过用explain检查两条SQL的执行计划,我们可以清楚地看到了这一点。

    例子中tab_with_index表的name字段有索引,但是name字段是varchar类型的,如果where条件中不是和varchar类型进行比较,则会对name进行类型转换,而执行的全表扫描。

    当我们用范围条件而不是相等条件检索数据,并请求共享或排他锁时,InnoDB会给符合条件的已有数据记录的索引项加锁;对于键值在条件范围内但并不存在的记录,叫做“间隙(GAP)”,InnoDB也会对这个“间隙”加锁,这种锁机制就是所谓的间隙锁(Next-Key 锁)。

    举例来说,假如emp表中只有101条记录,其empid的值分别是 1,2,...,100,101,下面的SQL:

    Select * from  emp where empid>100 for update;

    是一个范围条件的检索,InnoDB不仅会对符合条件的empid值为101的记录加锁,也会对empid大于101(这些记录并不存在)的“间隙”加锁。

    InnoDB使用间隙锁的目的,一方面是为了防止幻读,以满足相关隔离级别的要求,对于上面的例子,要是不使用间隙锁,如果其他事务插入了empid大于100的任何记录,那么本事务如果再次执行上述语句,就会发生幻读;另外一方面,是为了满足其恢复和复制的需要。有关其恢复和复制对锁机制的影响,以及不同隔离级别下InnoDB使用间隙锁的情况,在后续的章节中会做进一步介绍。

    很显然,在使用范围条件检索并锁定记录时,InnoDB这种加锁机制会阻塞符合条件范围内键值的并发插入,这往往会造成严重的锁等待。因此,在实际应用开发中,尤其是并发插入比较多的应用,我们要尽量优化业务逻辑,尽量使用相等条件来访问更新数据,避免使用范围条件。

    还要特别说明的是,InnoDB除了通过范围条件加锁时使用间隙锁外,如果使用相等条件请求给一个不存在的记录加锁,InnoDB也会使用间隙锁!

    在如表20-13所示的例子中,假如emp表中只有101条记录,其empid的值分别是1,2,......,100,101。

    表20-13    InnoDB存储引擎的间隙锁阻塞例子

    session_1

    session_2

    mysql> select @@tx_isolation;

    +-----------------+

    | @@tx_isolation  |

    +-----------------+

    | REPEATABLE-READ |

    +-----------------+

    1 row in set (0.00 sec)

    mysql> set autocommit = 0;

    Query OK, 0 rows affected (0.00 sec)

    mysql> select @@tx_isolation;

    +-----------------+

    | @@tx_isolation  |

    +-----------------+

    | REPEATABLE-READ |

    +-----------------+

    1 row in set (0.00 sec)

    mysql> set autocommit = 0;

    Query OK, 0 rows affected (0.00 sec)

    当前session对不存在的记录加for update的锁:

    mysql> select * from emp where empid = 102 for update;

    Empty set (0.00 sec)

    这时,如果其他session插入empid为201的记录(注意:这条记录并不存在),也会出现锁等待:

    mysql>insert into emp(empid,...) values(201,...);

    阻塞等待

    Session_1 执行rollback:

    mysql> rollback;

    Query OK, 0 rows affected (13.04 sec)

    由于其他session_1回退后释放了Next-Key锁,当前session可以获得锁并成功插入记录:

    mysql>insert into emp(empid,...) values(201,...);

    Query OK, 1 row affected (13.35 sec)

    注:关于Innodb什么情况下使用行锁,什么情况使用表锁,上面的例子介绍的通俗易通,适合初级DBA学习。原来出自http://brilon.iteye.com/blog/433726,欢迎交流沟通,谢谢!

    展开全文
  • MySQLMySQL(InnoDB存储引擎)默认是自动提交事务的,所以这个测试,...这里我主要针对的是悲观锁,其实也就是行锁和表锁,SQL 加上 FOR UPDATE 即可行锁这个时候,我们再开启一个客户端访问MySQL,输入同一条加锁的SQ...

    MySQL

    MySQL(InnoDB存储引擎)默认是自动提交事务的,所以这个测试,需要先将MySQL的autocommit设置为0,关闭自动提交,需要自己手动提交事务

    -- 关闭自动提交

    set autocommit=0;

    -- 开启事务

    begin;

    这里我主要针对的是悲观锁,其实也就是行锁和表锁,SQL 加上 FOR UPDATE 即可

    2a0a578e3f00b07c93623974f1b3c6f3.png

    行锁

    这个时候,我们再开启一个客户端访问MySQL,输入同一条加锁的SQL查询

    ebff65bb4729d98538b298dadd0ac4c1.png

    这个时候是没有任何结果的,因为t_card表已经加锁了(这个时候其实加的是行锁),所以cardid=‘1’ 这一行的其他加锁操作是无效的

    但是不加锁查询这一条记录却是可以的

    aaa4b48363fb9d7576e7ba00e69c38a7.png

    也就是说虽然这一条记录所在的行被锁定了,但是并不影响我们正常的查询,当然了针对这一行的DML操作也是无效的

    eeb0faf525de17d20d643b19fe698834.png

    12087df08bfd6e9c39806481bb157de7.png

    那如果我们对除了cardid=‘1’ 的其他行操作会怎样呢?

    8caa661d9516a81c5f83057cce10ac46.png

    对于其他的行DML是完全没问题的,所以我在前面才说这是行锁,因为只有我们的cardid=‘1’的行被锁了

    好吧,我们放过cardid=‘1’这一行吧

    eaa5079962fe3aa848cc2f7aeb57d168.png

    提交事务之后,另一边的加锁SQL才会生效

    表锁

    上面我们测试的只是行锁,那表锁,或者说怎样才会发生表锁?

    22b64bd683b0bc94137345d65936be23.png

    没错,我们不根据主键查询,而是查询所有的记录,MySQL就对整张表加锁了,这不就是表锁了嘛。对于这张表的任何记录进行DML都是无效的

    e9cddc1153fbbcf2ff35037e1f3a7fc2.png

    同时我们对于这张表的任何行进行加锁SQL操作是无效的,那普通的SQL查询又怎样呢?

    9c5117bde3006a24847ba34e3a792678.png

    还好,这不妨碍我们的普通查询,毕竟查询是与锁这东西没什么缘分的

    结论

    只要有锁存在的地方(无论是一行还是整张表),我们对有锁的地方进行任何加锁SQL都是无效的,当然了DML也是无效的;但是我们的普通查询是没有问题的,同时对于没有锁的行也是可以进行DML操作的

    至于如何解除锁,可以查看这篇博客: https://zhengdl126.iteye.com/blog/1570865 。最后记得把MySQL的autocommit = 1

    Oracle

    Oracle是需要我们手动提交事务的,所以,我们不需要任何设置即可测试

    ae0d654909926704dfee58dc40711feb.png

    只有提交事务之后,另一边才会生效,同样的普通查询是没有问题的。如果不根据主键查询,就会锁整张表。最后的结论是与MySQL一致的

    查看哪张表被锁以及解锁

    -- 查看哪张表被锁

    SELECT object_name, machine, s.sid, s.serial#, logon_time, locked_mode

    FROM gv$locked_object l, dba_objects o, gv$session s

    WHERE l.object_id = o.object_id

    AND l.session_id = s.sid;

    -- 解锁(根据上边SQL查询结果得到sid和serial#)

    --alter system kill session 'sid,serial#';

    ALTER system kill session '23,1647';

    展开全文
  • InnoDB的行锁和表锁

    2019-12-12 23:05:05
    InnoDB中存在行锁和表锁(通过给所有行加锁),下面举例说下使用行锁和表锁的情况(update语句会获取独占锁) 1)、查看表相关信息以及创建索引; 2)、id为主键(主键索引),使用id作为where...

    【Mysql存储引擎特性】

    MyISAM引擎的锁级别是Table(表锁),InnoDB引擎的锁级别是Row(行锁)。表锁的加锁效率高于行锁,意味着并发情况下,行锁要优于表锁。

    InnoDB中存在行锁和表锁(通过给所有行加锁),下面举例说下使用行锁和表锁的情况(update语句会获取独占锁)

    1)、查看表相关信息以及创建索引;

    2)、id为主键(主键索引),使用id作为where条件,不同事务能同时修改不同数据,此时为行锁;

    3)、name为普通索引,使用name为where条件,不同事务能同时修改不同数据,此时为行锁;

    4)、phone为唯一索引,使用phone作为where条件,不同事务能同时修改不同数据,此时为行锁。

    5)、使用money作为where条件,不同事务不能同时修改不同数据,此时为表锁。

    InnoDB的行锁实际上是通过给索引项加锁实现的。如果where条件(过滤条件)是通过索引,则进行行锁,否则,进行表锁(所有行加锁)。

     

     

    如果有写的不对的地方,请大家多多批评指正,非常感谢!

    展开全文
  • 行锁和表锁

    2019-07-21 19:43:59
    表锁: myisam在执行查询语句(SELECT)前,会自动给涉及的所有表加锁,在执行更新操作(UPDATE\DELETE\INSERT),会自动给涉及的表加写锁,这个过程不需要用户干预,因此,用户一般不需要直接用Lock Table命令给...
  • 对于行锁和表锁的含义区别,在面试中应该是高频出现的,我们应该对MySQL中的锁有一个系统的认识,更详细的需要自行查阅资料,本篇为概括性的总结回答。 MySQL常用引擎有MyISAM和InnoDB,而InnoDB是mysql默认的引擎。...
  • Innodb的行锁和表锁

    2021-01-17 17:07:25
    什么是行锁和表锁? 行锁:对一个表锁住某几行,其他事务对锁住的行不能进行写操作. 表锁:锁住整个表,其他事务对整个表不能进行写操作. 注意:这两个锁都是针对于事务来说的,没有开启事务或者是在一个事务里面也就不...
  • mysql InnoDB引擎的行锁和表锁

    千次阅读 2018-04-25 11:07:11
    之前是有接触行锁和表锁但是由于没有实际应用过也只是大概了解,前两天就遇到了并发同时对一条记录进行修改。mysql肯定会让修改请求排队,也就是说加了锁,但是mysql默认加的是表锁,但是会影响效率,所以我们需要用...
  • MYISAM不支持行锁,而InnoDB支持行锁和表锁。 1.行锁和表锁 2.行锁的类型 3.行锁的实现 1.行锁和表锁 在mysql 的 InnoDB引擎支持行锁,与Oracle不同,mysql的行锁是通过索引加载的,即是行锁是加在索引响应的行...
  • 一、前言对于行锁和表锁的含义区别,在面试中应该是高频出现的,我们应该对MySQL中的锁有一个系统的认识,更详细的需要自行查阅资料,本篇为概括性的总结回答。MySQL常用引擎有MyISAM和InnoDB,而InnoDB是mysql默认...
  • (Mysql 七)InnoDB引擎的行锁和表锁

    万次阅读 2017-02-22 00:32:01
    MYISAM不支持行锁,而InnoDB支持行锁和表锁。 1.行锁和表锁 2.行锁的类型 3.行锁的实现 1.行锁和表锁 在mysql 的 InnoDB引擎支持行锁,与Oracle不同,mysql的行锁是通过索引加载的,即是行锁是加在索引响应的...
  • 1.行锁和表锁在mysql 的 InnoDB引擎支持行锁,与Oracle不同,mysql的行锁是通过索引加载的,即是行锁是加在索引响应的行上的,要是对应的SQL语句没有走索引,则会全表扫描,行锁则无法实现,取而代之的是表锁。...
  • 对于行锁和表锁的含义区别,在面试中应该是高频出现的,我们应该对MySQL中的锁有一个系统的认识,更详细的需要自行查阅资料,本篇为概括性的总结回答。 MySQL常用引擎有MyISAM和InnoDB,而InnoDB是mysql默认的引擎。...
  • 在调用存储过程中,就会涉及到表锁行锁这一概念:所谓区别:有索引的时候就是行锁,没有索引的时候就是表索。innodb 的行锁是在有索引的情况下,没有索引的表是锁定全表的.表锁演示(无索引)Session1:mysql> set ...
  • 一、前言对于行锁和表锁的含义区别,在面试中应该是高频出现的,我们应该对MySQL中的锁有一个系统的认识,更详细的需要自行查阅资料,本篇为概括性的总结回答。MySQL常用引擎有MyISAM和InnoDB,而InnoDB是mysql默认...
  • 一、前言对于行锁和表锁的含意区别,在面试中应该是高频呈现的,咱们应该对MySQL中的锁有一个零碎的意识,更具体的须要自行查阅材料,本篇为概括性的总结答复。MySQL罕用引擎有MyISAM和InnoDB,而InnoDB是mysql默认...
  • 一、前言对于行锁和表锁的含义区别,在面试中应该是高频出现的,我们应该对MySQL中的锁有一个系统的认识,更详细的需要自行查阅资料,本篇为概括性的总结回答。MySQL常用引擎有MyISAM和InnoDB,而InnoDB是mysql默认...
  • 在使用mysql数据库的时候我们会遇到一个锁表的问题,当同一个表在进行update操作的时候,还没有操作完,之后又有请求操作该表的时候,表会进行锁定,锁定的方式呢就有两种分为行锁和表锁 顾名思义, 行锁就是锁一...
  • 原标题:mysql表锁和行锁的区别是什么Mysql有很多这种锁机制,比如行锁表锁等,读锁,写锁等,都是在做操作之前先上锁;这些锁统称为悲观锁(Pessimistic Lock)。下面本篇就来带大家了解一下mysql中的锁,介绍表锁...
  • MyISAM不支持行锁,而InnoDB支持行锁和表锁。 如何加锁? MyISAM在执行查询语句(SELECT)前,会自动给涉及的所有表加读锁,在执行更新操作(UPDATE、DELETE、INSERT等)前,会自动给涉及的表加写锁,这个过程并...
  • 锁在数据网络传输中是一个非常重要的概念,当多个用户对数据库进行操作时,会带来数据不一致的情况,所以,锁主要是在多用户情况下保证数据库数据完整性一致性。当然,数据库中的锁远不止于上面提到的两种。通常...
  • 另外,为了允许行锁和表锁共存,实现多粒度锁机制,InnoDB还有两种内部使用的意向锁(Intention Locks),这两种意向锁都是表锁。 意向共享锁(IS):事务打算给数据行共享锁,事务在给一个数据行加共享锁前必须先取得...
  • InnoDB 支持表锁和行锁,默认为行锁表锁:开销小,加锁快,不会出现死锁。锁粒度大,发生锁冲突的概率最高,并发量最低。 行锁:开销大,加锁慢,会出现死锁。锁粒度小,发生锁冲突的概率小,并发度最高。 ...
  • 1.行锁和表锁 在mysql 的 InnoDB引擎支持行锁,与Oracle不同,mysql的行锁是通过索引加载的,即是行锁是加在索引响应的行上的,要是对应的SQL语句没有走索引,则会全表扫描, 行锁则无法实现,取而代之的是表锁。 ...
  • 因为这个特性,所以数据库支持高并发,但是如果InnoDB更新数据的时候不是行锁,而是表锁的话,那么其并发性会大打折扣,而且也可能导致你的程序出错。 而导致行锁变为表锁的情况之一就是: SQL的更新(update)或者...
  • 对于行锁和表锁的含义区别,在面试中应该是高频出现的,我们应该对MySQL中的锁有一个系统的认识,更详细的需要自行查阅资料,本篇为概括性的总结回答。 MySQL常用引擎有MyISAM和InnoDB,而InnoDB是mysql默认的引擎...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,865
精华内容 1,146
关键字:

行锁和表锁