精华内容
下载资源
问答
  • 关注我,获取更多分享。你还不知道这个2PL是什么含义吗?...后来才知这是MySQL中的一个术语:2PL(Two-phase locking),翻译成中文就是阶段锁协议。废话不多说,我们来用实际的例子体验一把。准备实验环境实验的前...

    关注我,获取更多分享。

    你还不知道这个2PL是什么含义吗?看完下面的介绍,你就会豁然开朗。

    背景

    经常听到别人说2PL,猛的一听当时真的是一脸懵逼的感觉,啥意思?2PL是什么玩意?后来又听人说两阶段锁协议,这个又是什么?我咋没有听过呢?

    c0fc2fc7f0d80788e7753cc5226292cf.png

    后来才知这是MySQL中的一个术语:2PL(Two-phase locking),翻译成中文就是两阶段锁协议。

    废话不多说,我们来用实际的例子体验一把。

    准备实验环境

    实验的前提条件:

    RR可重复读事务隔离级别MySQL的版本是5.7.24使用innodb存储引擎的表来测试

    建表语句

    实验使用到的表结构如下所示:

    CREATETABLE`t`(`id`int(11)NOTNULL,`name`varchar(16)DEFAULTNULL,PRIMARYKEY(`id`))ENGINE=InnoDBDEFAULTCHARSET=utf8mb4;

    初始化数据

    此次实验中使用到的初始化数据如下所示:

    insertinto t(id, name)values(1,'A');insertinto t(id, name)values(2,'B');insertinto t(id, name)values(3,'C');insertinto t(id, name)values(4,'D');

    最终环境

    最后准备的环境如下:

    b80ac7b0838a9f2fc2460435331f4ed7.png

    实验

    实验步骤

    我们来简单说一下实验的具体步骤:

    开启一个左侧的事务。开启一个右侧的事务。在左侧事务中查询表t中的所有数据。在右侧事务中查询表t中的所有数据。在左侧事务中,获取id=3的数据行的X锁。在左侧事务中,更新id=3的数据行内容。在左侧事务中,查询更新后的id=3的数据行内容。在左侧事务中,获取id=2的数据行的X锁。在右侧事务中,尝试获取id=3的数据行的X锁,获取失败。实验截图

    实验的截图如下所示:

    dcbeadf7efc4c40b78163cb240ee2939.png

    问题:为什么在第9步中,没有获取到id=3的数据行的X锁呢?按道理左侧的事务已经修改完成了id=3的数据行,它已经去获取了id=2的数据行的X锁了,id=3的竖行的X锁对它已经没有用了,为什么在右侧事务中仍然不能获取到id=3的数据行的X锁呢?

    96fb4dcf3ce188ddf28d31b7e373efa5.png

    答案:MySQL中的两阶段锁协议的工作机制就是这么设计的。

    总结

    在MySQL中,两阶段锁协议的含义是:当一个事务获取到了某一个数据库对象的锁之后,并不是当前事务不需要操作它了之后,这个说就会马上释放掉,这个锁会一直被这个事务持有,直到这个事务被提交或回滚后,这个锁才会被释放掉。所以,在当前事务还没有结束的时候,任何其他事务尝试获取这个锁的时候,都会被阻塞。知道当前事务提交或回滚后,前提事务才可以获取到这把锁。

    这就是MySQL中2PL两阶段锁协议的含义。它在事务并发的时候,为数据的一致性提供有力的保障。

    展开全文
  • 阶段锁协议内容先举个例子,假设有一个表 t,主键是 id,其中一个字段是 k,在下面操作中,事务 B update 语句执行时,会是什么现象呢 ? 这个问题结论取决于事务 A 执行完前条语句后,持有哪些锁,以及...

    两阶段锁协议

    两阶段锁协议定义

    两阶段锁协议是 InnoDB 中的一种锁提交机制。

    两阶段锁协议内容

    先举个例子,假设有一个表 t,主键是 id,其中一个字段是 k,在下面的操作中,事务 B 的 update 语句执行时,会是什么现象呢 ?

    format,png

    这个问题的结论取决于事务 A 执行完前两条语句后,持有哪些锁,以及在什么时候释放。实际上,事务 A 持有两个记录的行锁,都是在 commit 的时候才释放的,所以事务 B 的 update 就会被阻塞,直到事务 A 执行 commit 之后,事务 B 才能被继续执行。

    也就是说,在 InnoDB 事务中,行锁是在需要的时候才加上的,但并不是不需要了就立刻释放,需要等事务结束时才释放,这就是两阶段锁协议,分为加锁阶段和解锁阶段,所有的 lock 操作都在 unlock 操作之后。

    两阶段锁协议的运用

    知道两阶段锁协议后,我们就可以,来避免一些并发操作中的锁。如果你的事务中需要锁多个行,要把最可能造成锁冲突、最可能影响并发度的锁尽量往后放。

    举个例子:

    假设你负责实现一个电影票在线交易业务,顾客 A 要在影院 B 购买电影票。我们简化一点,这个业务需要涉及到以下操作:

    从顾客 A 账户余额中扣除电影票价;

    给影院 B 的账户余额增加这张电影票价;

    记录一条交易日志。

    也就是说,要完成这个交易,我们需要 update 两条记录,并 insert 一条记录。当然,为了保证交易的原子性,我们要把这三个操作放在一个事务中。那么,你会怎样安排这三个语句在事务中的顺序呢?

    分析解决:

    试想如果同时有另外一个顾客 C 要在影院 B 买票,那么这两个事务冲突的部分就是语句 2 了。因为它们要更新同一个影院账户的余额,需要修改同一行数据。根据两阶段锁协议,不论你怎样安排语句顺序,所有的操作需要的行锁都是在事务提交的时候才释放的。所以,如果你把语句 2 安排在最后,比如按照 3、1、2 这样的顺序,那么影院账户余额这一行的锁时间就最少。这就最大程度地减少了事务之间的锁等待,提升了并发度。

    展开全文
  • 微信搜索“coder-home”或扫一扫下面的二维码,关注公众号,第一时间了解更多...后来才知这是MySQL中的一个术语:2PL(Two-phase locking),翻译成中文就是阶段锁协议。 废话不多说,我们来用实际的例子体验一把。 .
    微信搜索『coder-home』,或者扫一扫右侧的二维码,关注『程序猿集锦』。
    了解更多干货分享,还有各类视频教程。
    扫描它,带走我。

    背景

    经常听到别人说2PL,猛的一听当时真的是一脸懵逼的感觉,啥意思?2PL是什么玩意?后来又听人说两阶段锁协议,这个又是什么?我咋没有听过呢?

    后来才知这是MySQL中的一个术语:2PL(Two-phase locking),翻译成中文就是两阶段锁协议。

    废话不多说,我们来用实际的例子体验一把。

    准备实验环境

    实验的前提条件:

    • RR可重复读事务隔离级别
    • MySQL的版本是5.7.24
    • 使用innodb存储引擎的表来测试

    建表语句

    实验使用到的表结构如下所示:

    CREATE TABLE `t` (
      `id` int(11) NOT NULL,
      `name` varchar(16) DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
    

    初始化数据

    此次实验中使用到的初始化数据如下所示:

    insert into t(id, name) values(1, 'A');
    insert into t(id, name) values(2, 'B');
    insert into t(id, name) values(3, 'C');
    insert into t(id, name) values(4, 'D');
    

    最终环境

    最后准备的环境如下:
    在这里插入图片描述

    实验

    实验步骤

    我们来简单说一下实验的具体步骤:

    1. 开启一个左侧的事务。
    2. 开启一个右侧的事务。
    3. 在左侧事务中查询表t中的所有数据。
    4. 在右侧事务中查询表t中的所有数据。
    5. 在左侧事务中,获取id=3的数据行的X锁。
    6. 在左侧事务中,更新id=3的数据行内容。
    7. 在左侧事务中,查询更新后的id=3的数据行内容。
    8. 在左侧事务中,获取id=2的数据行的X锁。
    9. 在右侧事务中,尝试获取id=3的数据行的X锁,获取失败。

    实验截图

    实验的截图如下所示:
    在这里插入图片描述

    问题:为什么在第9步中,没有获取到id=3的数据行的X锁呢?按道理左侧的事务已经修改完成了id=3的数据行,它已经去获取了id=2的数据行的X锁了,id=3的竖行的X锁对它已经没有用了,为什么在右侧事务中仍然不能获取到id=3的数据行的X锁呢?

    答案:MySQL中的两阶段锁协议的工作机制就是这么设计的。

    总结

    在MySQL中,两阶段锁协议的含义是:当一个事务获取到了某一个数据库对象的锁之后,并不是当前事务不需要操作它了之后,这个锁就会马上释放掉,这个锁会一直被这个事务持有,直到这个事务被提交或回滚后,这个锁才会被释放掉。所以,在当前事务还没有结束的时候,任何其他事务尝试获取这个锁的时候,都会被阻塞。知道当前事务提交或回滚后,前提事务才可以获取到这把锁。

    这就是MySQL中2PL两阶段锁协议的含义。它在事务并发的时候,为数据的一致性提供有力的保障。

    微信搜索『coder-home』,或者扫一扫右侧的二维码,关注『程序猿集锦』。
    了解更多干货分享,还有各类视频教程。
    扫描它,带走我。
    展开全文
  • 摘要在这篇文章中,我将从上一篇的一个小例子开始,跟你介绍一下InnoDB中的行锁。在这里,会涉及到一个概念:阶段加锁协议。...1 行锁在上一篇的文章中,我们用了这个具体的例子来解释MVCC:假设我们调换一下T5...

    摘要

    在这篇文章中,我将从上一篇的一个小例子开始,跟你介绍一下InnoDB中的行锁。

    在这里,会涉及到一个概念:两阶段加锁协议。

    之后,我会介绍行锁中的S锁和X锁,以及这两种锁的作用。

    但是我们会发现仅仅有行锁是不能解决幻读问题的,于是我会用例子的方式跟你介绍各种间隙锁。

    最后,我会聊一聊粒度更大的表级锁和库锁。

    1 行锁

    在上一篇的文章中,我们用了这个具体的例子来解释MVCC: 

    dd858abd03057dfb8af4909388bad022.png

    假设我们调换一下T5和T6:

    68e44b03173d28236b19ae22469fedc5.png

    此时,T5是没有办法执行的。

    原因是这样的:InnoDB在更新一行的时候,需要先获取这一行的行锁

    但是,当一条语句获取了行锁之后,不是这行语句执行完毕就能释放锁,而是要等到这个事务执行完毕,才会释放锁。

    这里涉及到了两阶段加锁协议:它规定事务的加锁和解锁分为两个独立的阶段,加锁阶段只能加锁不能解锁,一旦开始解锁,则进入解锁阶段,不能再加锁。

    然后我们再来说说共享锁(S锁,读锁)排他锁(X锁,写锁)

    对于共享锁来说,如果一个事务获取了某一行的共享锁,则这个事务只能读这一行数据,而不能修改,并且其他事务也可以获取这一行数据的共享锁,读取这一行的数据,同样不能修改数据。

    对于排它锁,只能被某一个事务获取。并且在获取排它锁之前,这一行数据上不能存在共享锁。一旦某一个事务获取了这一行的排它锁,那么只有这一个事务可以对这一行数据进行读写操作,其他事务对这一行数据的读写操作都会被阻塞。

    此外,不仅仅只有更新操作,插入删除操作也会获取这一行数据的X锁。

    在这里我还要再介绍这两个概念:“快照读”和“当前读”。

    你可能还会有印象,在上一篇内容中,我提到了所有的更新操作都必须是“当前读”,现在可以解释原理了,在更新一行数据的时候,InnoDB会对需要更新的那行数据加上X锁,直接获取最新的那一行数据。

    与之相对的是“快照读”,也就是MVCC中的数据读取方式,利用“快照”来读取数据的方式,可以极大的提高事务的并发度。

    但是并不是说select语句就只能读取快照,它也照样可以给需要读取的数据加锁,来读取最新的数据。也就是说,select语句也一样可以“当前读”。

    下面这两个select语句,就是分别加了读锁(S锁,共享锁)和写锁(X锁,排他锁)。

    mysql> select k from t where id=1 lock in share mode;
    mysql> select k from t where id=1 for update;

    注意,由于两阶段加锁协议的存在,如果你采用了一致性读,那么这个锁必须要等事务提交后才能解除。这是牺牲了并发度的一种做法。所以,如果所有的select语句,都加上了S锁,此时的“可重复读”,就变成了“序列化”。

    2 间隙锁

    2.1 幻读问题

    还记得我们上面提到过的幻读吗?

    现在你应该能够理解幻读产生的原因了:因为在插入数据的时候,InnoDB采用的是当前读,而读取数据的时候,由于MVCC的存在,采用的是快照读,这就造成了幻读。

    但是我们在上面又提到了,select语句也一样可以采用“当前读”。那么,这样能解决幻读吗?

    答案是能解决其中一种情况的幻读。

    比如我们在上一篇文章中举的关于幻读的例子:

    668e6abf378e0f4e309ceac7afe59144.png

    现在你能理解了,因为这里的select是快照读,而事务B的插入操作对于事务A来说是不可见的。如果在T5时刻,事务A的sql语句是select * from t where v = 0 for update,即采用当前读的话,是可以看得到事务B所提交的数据的,这样的话,就避免了幻读的情况。

    那如果在T2时刻,事务A的语句就是select * from t where v = 0 for update会怎么样的?

    如果在T2时刻就使用了“当前读”,那么T3时刻事务B是无法进行插入操作的。你可以理解为,T2时刻,InnoDB把v=0的数据,都给加上了一把锁。

    因为这行sql语句v=0的数据行都锁住了,所以没有办法再插入一行v=0的数据。  

    这听起来似乎没什么不对的,但是你仔细想一想,InnoDB中的行锁,锁住的是已经存在的数据。而对于即将要插入的数据,为什么也会被锁住呢?这是不符合行锁的定义的。

    这个时候就可以说到间隙锁了。

    简单来讲,就是这条语句不仅会锁住所查询的那行数据,还会把这行数据周围的间隙锁住,不让其他事务插入。

    也就是说,行锁是锁住已有的数据,而间隙锁,是锁住即将要插入的位置,不让其他数据插入。

    在官方文档有这么一句话:

    Gap locking can be disabled explicitly. This occurs if you change the transaction isolation level to READ COMMITTED or enable the innodb_locks_unsafe_for_binlog system variable (which is now deprecated).

    也就是说,间隔锁在“可重复读”事务隔离级别是默认生效的。所以,MySQL在“可重复读”的事务隔离级别下,是有办法解决幻读问题的。

    下面我们来看看哪些情况InnoDB会给数据加上间隔锁,并且这里的间隔锁范围有多大,注意,下面列举的四种情况,指的是where条件中的字段的索引类型。

    • 主键索引

    • 唯一普通索引

    • 非唯一普通索引

    • 无索引  

    先定义这么一个表:

    CREATE TABLE `t` (
      `id` int(11NOT NULL,
      `a` int(11DEFAULT NULL,
      `b` int(11DEFAULT NULL,
      `c` int(11DEFAULT NULL,
      PRIMARY KEY (`id`),
      UNIQUE KEY `a` (`a`),
      KEY `b` (`b`)
    ENGINE=InnoDB;

    id是主键,a是一个唯一索引,b是一个普通索引,c不包含任何的索引字段。

    然后插入以下的这些数据:

    insert into t values(0,0,0,0),(5,5,5,5),(10,10,10,10);

    然后我们开始分析各种情况。

    2.2 主键索引

    4fcb2e2412021cb367feb89abf461e2b.png

    因为没有其他的数据,所以主键索引在数据页内的编排如上图,并且含有4个空隙。这里说的“空隙”,指的是数据可以插入的位置

    比如我要插入一个id为3的数据,这条数据就会插入到位于(0,5)这个空隙内。

    下面我们开始尝试:

    b5866c6b65a6998ba7bb8f42bcafb3bd.png

    毫无疑问T3时刻的sql语句是会被阻塞的,原因是id = 5的这行数据已经被加锁了。那么,会不会存在有间隙锁呢?

    因为这是一个主键索引,InnoDB必须保证id = 5的数据是唯一的,所以对于id=5的周围,比如(0,5)和(5,10),不需要再加间隙锁了。

    94e63b4a630a274066d9fab462dc739c.png

    那么换一个条件再试试,我们查找id大于6且id小于8的数据,此时事务B中的语句同样会被阻塞。

    这是因为,在主键索引没有命中的时候,会对所在的空白范围,全部加锁。注意,我这里说的是未命中的所有空白范围,哪怕我这里的查找条件是大于6且小于8,但是加锁的范围不是(6,8),而是(5,10)。

    你可以简单的理解为:从查找条件的最小值开始,往前找到第一个索引值;并且从查找条件的最大值开始,往后找到第一个索引值,这个范围就是加锁的范围。

    你可能还会有一个疑问,如果是select * from t where id = 8 for update会怎么样呢?这个问题和上面一样,只要未命中,就加范围锁,锁住空隙(5,10)。

    总结一下:对于主键索引来说,命中了,就只加行锁;没命中,则对查找范围的最小值往前找第一个主键,查找范围的最大值往后找第一个主键,并对这个范围加上间隙锁。

    2.3 唯一索引

    f93e15de1f5a05e54af061fd54a113db.png

    对于唯一索引来说,和主键索引其实是差不多的。当索引命中之后,因为唯一索引同样保证了索引的唯一性,所以不需要给这行数据的周围加上间隙锁,只会给命中的数据加锁。

    但是这里和主键索引不同的地方是,在给唯一索引a = 5加锁的同时,还会回表,将a = 5对应的主键id = 5这行记录加锁。所以,事务B的修改也同样会被阻塞。

    这也是为了防止造成数据不一致的情况,比如我把a = 5的这行数据删了,然后事务B又通过这行数据的主键来对这行数据进行操作。

    对于带有范围的查找,和上面主键索引的间隙锁规则是一样的,这里不再赘述。值得注意的是,在唯一索引中,只要命中了,就会相应的给这条索引对应的主键id也加锁。

    还需要补充一点,当主键索引和唯一索引直接命中的时候,如下图所示,InnoDB除了给a = 5这行数据加了行锁,还可能给(5, 5)这个间隙加了间隙锁,这样的说法听起来很奇怪。

    5207408081c9f49e662c39dd64a2d020.png

    因为事务A是给a = 5这行数据加了行锁,而行锁只能针对已经存在的数据,不能加到即将插入的数据上;此外,当事务A执行这条语句的时候,事务B是会被阻塞的。直到事务A提交,事务B才会提示唯一索引重复。也就是说,在事务B执行这行语句的时候,是无法访问id = 5这行数据的,事务B不知道id = 5到底存不存在

    所以我才说:当索引直接命中的时候,还会加上这么一个小小的间隙锁。我没有查到这方面的资料,如果你能解释的话,请留言告诉我。

    2.4 普通索引

    对于普通索引来说,与唯一索引最大的区别,就是普通索引不是必须唯一的,也就是说,当插入数据的时候,可能会有重复的情况。

    而在上面的内容中我们也发现了一个规律:InnoDB的间隙锁,就是为了防止新插入的数据影响查找结果。

    所以对于普通索引来说,还需要防止新插入的数据和原数据一样的情况(因为唯一索引不需要担心这么一种情况)。

    下面我们举例说明,在此之前先插入一行数据:

     insert into t values(8,8,5,8);

    那么此时我们的索引b,是这样的:

    4db801d95a70c167fa8d320a4d3ea0d9.png

    因为是非唯一索引的原因,在两个b = 5的间隙,也能插入数据。

    61a99896c63ad110f8de595eb624c79c.png

    如图所示,我们这次把查找条件换成了b = 5。此时,我们插入的数据id = 1,理论上应该要插入(0,5)这个间隙内,但是由于间隙锁的存在,插入将被阻塞。

    换一句话说,只要此时插入的数据b = 5,那么就一定无法插入。

    而对于未命中的条件,规则和上文中说到的一样,根据查找条件的最小值往前找到第一个一个索引,再根据这个条件的最大值往后找到第一个索引,构成间隙锁的范围。

    此外,与唯一索引一样,所有命中的数据行,都会回表将主键id也锁住。

    2.5 无索引

    99490bf97acc919408b4b8a312aaf8ca.png

    可以看到,我们的查找条件是c = 5,直接命中了数据。此时我们插入的数据是c = 6,看起来和事务A无关,但是出乎意料的是,事务B还是会被阻塞

    直接说结论:对于不含有索引的查找项来说,会锁住所有的间隙和所有的数据。

    关于幻读的问题的一些case,到这里就研究完了(但是我不确定有没有遗漏,如果有,还请你留言告诉我)。

    在最后还需要说一个概念,行锁与间隔锁,合称next-key lock。并且需要注意的是,只有在可重复读的事务隔离级别中,才会有间隔锁。并且可重复读是遵循两阶段锁协议,所有加锁的资源,都是在事务提交或者回滚的时候才释放的。所以,在防止幻读产生的时候,同样降低了并发度。

    3 表级锁

    在上一节说完了行级锁之后,我们再来聊聊表级锁。

    表级锁有两种,一种是显式添加的,一种是隐式添加的。

    3.1 读写表锁

    还记得我们在上文中提到的读锁和写锁的特点吗,这点在表锁中是一样的。

    给表加上了写锁,意味着只有这个会话拥有读写这个表的权限;给表加上了读锁,才能读取这个表上的数据,并且可以多个线程共享读锁,但是,只有当某个表上没有读锁时,才能给这个表加上写锁。

    下面是给表加锁的语法:

    lock tables table_name read  
    lock tables table_name write

    3.2 MDL

    MDL指的是(Metadata Lock),指的是元数据锁。

    MDL也分为了读锁和写锁,功能和上面提到的一样。

    只不过MDL不需要像表锁那样显式的使用,它会在访问一个表的时候会被自动加上。其中,在某个表对数据进行操作(包括insert,delete,update,select)的时候,会隐式的加上MDL读锁,在修改表的结构的时候,会加上写锁

    这样做的目的是,防止在一个事务操作数据的时候,表结构被另一个事务给修改了。或者在某一个事务修改表结构的时候,不允许其他的事务操作数据。

    4 库锁

    顾名思义,库锁就是对整个数据库实例加锁。

    MySQL提供了一个加全局读锁的方法,命令是Flush tables with read lock (FTWRL)

    使用过这个命令之后,相当于对全库增加了一个读锁,此时其他线程的数据更新语句(数据的增删改)、数据定义语句(包括建表、修改表结构等)和更新类事务的提交语句都会被阻塞。

    全局锁的典型使用场景是,做全库逻辑备份。当然了,实现这个功能,我们也可以使用“可重复读”的事务隔离级别,做一次快照读,依然可以实现备份的功能。只不过,有些引擎并没有实现这个事务隔离级别。

    写在最后

    首先,谢谢你能看到这里。

    在这篇文章中,尤其是间隙锁部分的内容,我没有查到太多的资料,所以很多内容都是我自己的理解。所以如果你发现了一些bad case,请你留言告诉我。又或者你发现了我哪里的理解是不对的,也请你留言告诉我,谢谢!

    当然了,如果有哪里是我讲的不够明白的,也欢迎留言交流~

    bdd10812e6304ccf595ee7bf615e9410.png

    推荐阅读

    • 更好的理解 MySQL (3):事务隔离


    喜欢本文的朋友,欢迎关注“Go语言中文网

    c1524d2685b3e9cae5efc241a945c4bc.png

    Go语言中文网启用信学习交流群,欢迎加微信274768166,投稿亦欢迎

    展开全文
  • 行锁行锁其他概念阶段锁协议死锁解决死锁检测消耗太多资源方案 行锁 1. mysql行锁是在引擎层由各个引擎自己实现,但并不是所有引擎都支持行锁,比如MyISAM就不支持行锁 2. 行锁就是针对数据表中行记录锁...
  • 这些内容对于编写TCP/IP网络应用程序的程序员和负责维护基于TCP/IP协议的计算机网络的系统管理员来说,应当是必读的。 参加本书翻译的有:谢钧(序言和第1章~第7章),蒋慧(第8章~第14章,第22章~第23章),吴礼发(第15...
  • 行锁 ...这个就是阶段锁协议。 如果你事务中需要锁多个行,要把最可能造成锁冲突、最可能影响并 发度申请时机尽量往后放。 例子:假设你负责实现一个电影票在线交易业务,...
  • 行锁顾名思义,就是针对单行数据加锁,在mysql中,锁实现是由引擎层实现,MyISAM引擎就不支持行锁不...阶段锁协议先举个例子,事务B语句执行时候会发生什么现象?这取决于事务A在执行完条语句后持有那...
  • 行锁顾名思义,就是针对单行数据加锁,在mysql中,锁实现是由引擎层实现,MyISAM引擎就不支持行锁不...阶段锁协议先举个例子,事务B语句执行时候会发生什么现象?这取决于事务A在执行完条语句后持有那...
  • mysql行锁和死锁检测

    2019-05-12 22:52:00
    行锁顾名思义,就是针对单行数据加锁,在mysql中,锁实现是由引擎层实现,MyISAM引擎就不支持行锁 不支持行锁就意味着并发...阶段锁协议 先举个例子,事务B语句执行时候会发生什么现象?这取决于事务A...
  • 这里用 innodb 行锁举个例子,如下图:对上图的两个事务,由阶段锁协议可知:这时候,事务 A 在等待事务 B 释放 id=2 行锁,而事务 B 在等待事务 A 释放 id=1 行锁。 事务 A 和事务 B 在互相等待对方资源...
  • 最新版HDMI 标准中又增添了新特性,如音频回传通道(ARC)、3D显示格式以及对消费电子控制(CEC)协议的改进。当然,消费者都希望他们新买的家庭影院设备能具备所有这些HDMI新特性,并且物美价廉、操控简易。因此,家庭影院...
  • 在此之前译者只是奇怪有相当长时间访问不了Stevens博士个人主页,并没想到其背后隐蔽着这件令全世界计算机界和网络工作者为之扼腕叹息事。当时本书翻译工作尚未开始,译者也曾一度在是否接手翻译上徘徊...
  • C#微软培训教材(高清PDF)

    千次下载 热门讨论 2009-07-30 08:51:17
    C#--微软.NET第一语言 本书着重介绍语言本身,比较少涉及应用,不错入门书,从头讲起,不怕不明白。 <<page 1>> page begin==================== 目 目目 目 录 录录 录 第一部分 C#语言概述.4 ...
  • C#微软培训资料

    2014-01-22 14:10:17
    以互相交换组件地方以互相交换组件地方 以互相交换组件地方 比尔 比尔比尔 比尔.盖茨 盖茨盖茨 盖茨 在本章中你将了解 Microsoft.NET 概念 .NET 框架 C#语言在.NET 框架中作用及其特性...
  • 12.1.3 文件透明加密软件的例子 253 12.2 区分进程 254 12.2.1 机密进程与普通进程 254 12.2.2 找到进程名字的位置 255 12.2.3 得到当前进程的名字 256 12.3 内存映射与文件缓冲 257 12.3.1 记事本的内存映射...
  • 12.1.3 文件透明加密软件的例子 253 12.2 区分进程 254 12.2.1 机密进程与普通进程 254 12.2.2 找到进程名字的位置 255 12.2.3 得到当前进程的名字 256 12.3 内存映射与文件缓冲 257 12.3.1 记事本的内存映射...
  • §12.3 实际优化例子 139 §12.3.1 避免基于规则优化器技术 139 §12.3.2 索引代价 139 §12.3.3 分析统计数据 139 §12.3.4 避免复杂表达式 142 §12.3.5 处理复杂逻辑 143 §12.3.6 一般SQL语句优化 143 §...
  • asp.net知识库

    2015-06-18 08:45:45
    一个XSLT简单例子 XSLXSLT板主题整理 xsl入门好文章 新手学习XSL好东西 XSL语法介绍 XSL学习心得 - 调用属性值 XSLT与XML转换详细介绍 功能应用 读写搜索 基础教程 RSS Web2.0时代,RSS你会用了吗?(技术...
  • <div><p>多研究些架构,少谈些框架(1) -- 论微服务架构的核心概念 ...还是接着上面的例子,我们设计Stock对象需要代表一种商品的实际库存,并在这个对象上面加上业务逻辑的方法 ...
  • 书中吸纳了近几年网络技术发展,增添了ipv6、sctp协议和密钥管理套接字等内容,深入讨论了最新关键标准、实现和技术。  书中所有示例都是在unix系统上测试通过真实、可运行代码,继承了stevens一直强调...
  • springCloud

    2018-08-09 16:54:33
    AMQP,即Advanced message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然。 ...
  • sso-cookie 跨域读写cookie的例子 思维导图 和java相关的 更多干货 分布式实战(干货) spring cloud 实战(干货) mybatis 实战(干货) spring boot 实战(干货) React 入门实战(干货) 构建中...
  •  本书还提供了dba完成本职工作必备的基本的uniix、sql、pl/sql和数据建模的知识,也给出了许多富有趣味性的例子,通过这些实例详细、循序渐进地说明了oracle database 11g数据库的各个概念和特性。 作译者  Sam...
  • 这是一本专门讲解Java并发书,涉及到各种、常见安全集合类,基本就是将 JUC(java.util.concurrent包简称)里所有内容覆盖了一遍,看完你一定有收获。强烈推荐! 上面推荐几本书可能不太容易读懂,建议...
  • 该资料是《深入解析SQL Server 2008》随书源代码 对应书籍资料见: 深入解析SQL Server 2008(微软SQL Server开发团队必读之作) 基本信息 原书名: Microsoft SQL Server 2008 Internals 原出版社: Microsoft...
  • Java代码实例

    2016-06-21 22:44:51
    3.7.4 令人困扰的例子 37 3.8 赋值运算 37 3.8.1 普通赋值运算 37 3.8.2 运算赋值运算 38 3.9 括号及运算符间的优先级关系 38 3.10 常用数学工具包——java.lang.Math类 39 3.10.1 数学常量 39 3.10.2...
  • Java SE 6.0编程指南 源码

    热门讨论 2012-05-18 13:40:45
    对于初学者,这上面的例子浅显易懂,而且涉及到 java 的方方面面的知识,比较适合全面初窥java 的人。这个资源 CSDN上已经有了,但是要很多积分,呵呵,所以我在重新传递一下。 同时我把目录页提供上来,本书的实例...

空空如也

空空如也

1 2 3
收藏数 43
精华内容 17
关键字:

两段锁协议的例子