写4个个人收藏怎么删除视频,怎么移除

读锁又称为共享锁简称S锁,顾洺思义共享锁就是多个事务对于同一数据可以共享一把锁,都能访问到数据但是只能读不能修改。

写锁又称为排他锁简称X锁,顾名思义排他锁就是不能与其他所并存,如一个事务获取了一个数据行的排他锁其他事务就不能再获取该行的其他锁,包括共享锁和排他鎖但是获取排他锁的事务是可以对数据就行读取和修改。

共享锁 很好理解就是多个事务只能读数据不能改数据。

排他锁 指的是一个事務在一行数据加上排他锁后其他事务不能再在其上加其他的锁。

mysql InnoDB引擎默认的修改数据语句update,delete,insert 都会自动给涉及到的数据加上排他锁,select 语句默认不会加任何锁类型

说了这么多,咱们来看下以下简单的例子

现在我们对id=1的数据行排他查询,这里会使用BEGIN开启事务而不会COMMIT提交事務,这样做是用来测试因为提交事务或回滚事务就会释放锁。

会查询到一条数据现在打开另一个查询窗口,对同一数据分别使用排他查和共享锁查询两种方式查询:

我们看到开了排他锁查询和共享锁查询都会处于阻塞状态因为id=1的数据已经被加上了排他锁,此处阻塞是等待排他锁释放

如果我们直接使用以下查询呢:

我们看到是可以查询到数据的。

我们再看一下一个事务获取了共享锁在其他查询中也加共享锁或不加锁的情况。

共享锁的事务查询没有关闭事务

排他锁,接着使用排他锁来查询:

我们看到是不加锁的查询和共享查可以查詢数据的但加排他锁就查不到,因为排他锁与共享锁不能存在同一数据上

此时共享查询处于阻塞,等待排它锁的释放但是用普通查询能查到数据,因为没用上锁机制不与排他锁互斥但查到的数据是修改数据之前的老数据。

然后我们提交数据释放排他锁看下修改后的数据,此时可用排他查共享查和普通查询, 因为事务提交后该行数据释放排他锁下面就只显示普通查询,其他的同学们自己詓验证

可以看到结果与预期的一样。

?文源网络仅供学习之用,如有侵权联系删除。

我将优质的技术文章和经验总结都汇集在了我嘚公众号【Java圈子】里为方便大家学习,还整理了一套学习资料免费提供给热爱Java的同学! 更有学习交流群,多交流问题才能更快进步~

虽然我们知道在高级语言里面,串 和 一般的数据的标识符会有一些不一样(比如C++ 里面整形的 int 以及字符串的 string )但是在底层语言里面,他们类型其实都是一样的二进制数只不过串是一个数据块。我们用下图说明一下:

那么 在执行串操作之前,我们需要确定以下的几件事情:

  1. 串所在的区域串的首地址(这里的串包括源串和目标串)
  2. 串操作的方向,这个我们用一张图来理解:

如果横向的蓝色箭头表示的是源串首假如串操作的方向是 由低地址向高地址,那么实际上要操作的串就是下方的一块区域;但是如果方向是 由高地址向低地址那么要操作的串就应该是上方的一块區域。二者的串本身完全不一样!

  1. 串操作的指令之前可以加上一个重复前缀

下面,我们一一来解释以下:
【1】首先是串的位置:我们的操作对象是 源串和目标串其中,源串默认的段首地址存放在 DS (数据段里面)串首地址存放在 DS 可以使用段超越变成其他段)
目标串它嘚段地址默认是在附加段 ES 不允许被段超越!)

【2】关于串的长度,我们会将串的长度值存放在 CX 里面在使用串操作指令之前,我们需要给

【3】关于串操作的方向我们使用状态标识里面的 0 DF=0 表示的是串操作从低地址向高地址执行;如果 DF=1,那么表示从高地址向低地址执行同样哋,我们也要在使用串操作指令之前给

【4】关于串操作指令前面的循环前缀(这是串操作指令所特有的),重复前缀可以分为无条件前綴和条件前缀其中,无条件前缀我们用 REP 表示它的意思是:只要当 0 CX??=0的情况下,我们就一直执行 REP 后面跟着的语句 我们可以看到因为昰无条件地反复执行,因此后面常常跟串传输类指令

而对于条件前缀,我们分两种:

1.1 串操作指令执行的一般流程

其中我们可以看到流程图主要分成了两块:左边的四个步骤,我们称之为初始化这里需要特别说明:串操作指令中,每操作完一个字节或者一个字之后串艏指针是指令自动更改的。不需要我们手动设置而上图几乎是所有串操作指令执行都需要经过的流程图,我们发现:在每操作完一个字節或者一个字之后并不是立刻就去判断是不是已经完成了所有操作,而是在修改完地址指针之和还需要经过修改串长度(这需要我们洎己写程序控制)的这个操作之后,才到判断

下面,我再把这个图分模块画一下:

那么试想一下:假如我们的串操作方向是 DF = 0,而且是┅个串传输指令;那么在所有数据传输完毕之后串首指针应该是在串尾的后一位!

MOVS,更具体地说应该分成两种: MOVSB 顾名思义就是传送1个芓节(也就是8位)的串;而 MOVSW 则是传送 1个字的串。

我们看一个例子学习它的用法:

MOVS指令将200个字节数据从内存数据段 MEM1 为首地址的区域送到一個逻辑段 MEM2

LEA SI, MEM1 //这句话的意思是给源串的串首赋初值(要赋值给SI寄存器) LEA DI MEM2 //这句话也是给目标串的串首地址赋初值(要赋值给 DI 寄存器) CLD //令 DF = 0,说明是從低地址向高地址执行 

MOVSW的这样的话,我们的 CX 就要赋初值为 100 了因此

那么,假如我们想要验证我们传输的串对不对那么就需要将这两个串进行比较。因此就引出了串比较指令:

同样地CMPS 也分为:CMPSB, CMPSW。它执行的是啥呢—— 目标串 - 源串,但是结果并不返回目标串也即是实现兩串的比较。

对于串比较指令我们一般在它前面加条件前缀。

那么依旧是刚刚的例子,我们在传输完了 200 个字节的串之后想要检测一丅是否正确传输,我们就需要比较两个串了:下面是程序分析:

CLD //上面四条语句全都是初始化 JZ STOP //JZ 表示当 ZF = 1 时执行跳转执行到这里如果ZF仍然为1说奣两串一样 DEC SI //完成SI的自减,回顾上面的流程图SI现在是在串低的后一位

首先,我们明确一件事情:REPE 的意思是相同即重复( 0 ZF=1)也就是说当比較的串一样时,就继续比那么 REPE 退出的情况有什么呢?

  1. CX = 0(说明比完了那么就是两个串完全一样)
  2. 0 0 ZF=0(说明在中间有两个串不一样的地方了)

SCASW。当我们使用 时源操作数是不用写出来的,但是要在程序的前面声明(注意:使用 SCASB时,一次操作一个字节单元源操作数就是

SCASB 为例,它执行的是将 AL 里面存放的字节依次 和串内的每一个字节单元相减但是结果不返回,影响标志位 ZF用于搜索串里面有没有哪个字节单元嘚内容和

举一个例子:在 ES段中从 2000H 单元开始存放了 10 个字符,寻找其中有没有字符 ‘A’若有则记录搜索次数,将搜索次数写入 DATA1 单元并将 ‘A’ 写入 DATA2 单元。

首先我们要明确一件事情:目标串地址在 ES:DI 里面。

MOV BX, DI //地址备份用于后面计算搜索次数 MOV CX, 10 //因为如果采用SCASB,那么就是一个字节一个芓节搜索10次 REPNZ SCASB //“若不相等则重复”,如果不相等即ZF = 0 ,那么就一直搜索 FOUND: DEC DI //因为 DI 是先自增之后才进入判断的所以在跳出之后DI 会在 'A' 的后一个单え

2.4 串加载与串存储

【1】首先是串加载,我们用 LODSW既然是 加载,那么就是将串中的数据装载到某个地方因此,在 LODSW 中串是作为源操作数的,地址在

LODSB那么它执行的操作是将数据段中地址为 LODSW,那么它执行的操作是将数据段中地址为

【2】下面是串存储我们用 STOSW,既然是存储就昰把某个内容存储进串里。因此此时串就作为目标串,地址为:

STOSB那么它执行的是将 AL 里面的内容存储进 STOSW,那么它执行的是将 AX 里面的内容存储进

注意:在串加载与串存储中是已经限定了

中国好声音之个人赛“封印权”噺玩法 李荣浩惨遭围攻被迫四连战

参考资料

 

随机推荐