前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >select for update加了行锁还是表锁?

select for update加了行锁还是表锁?

作者头像
程序猿川子
发布于 2023-02-07 10:02:47
发布于 2023-02-07 10:02:47
60900
代码可运行
举报
运行总次数:0
代码可运行

前言

大家,我是田螺

最近在开发需求的时候,用到了select......for update。在代码评审的时候,一位同事说 ,唯一索引+一个非索引字段,是否可能会锁全表呢?本文田螺哥将通过9个实验操作的例子,给大家验证select......for update到底加了什么锁,是表锁还是行锁

以下是本文的提纲哈:

因为加锁是跟数据库的隔离级别息息相关的。而常用的数据库隔离级别也就RC(读已提交)和RR(可重复读),所以本文分别根据RC(读已提交) 和 RR(可重复读)隔离级别展开讲述。

  • 公众号:捡田螺的小男孩
  • github地址,感谢每颗star:github

1. 环境准备

设置数据库隔隔离级别

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mysql> set global TRANSACTION ISOLATION level read COMMITTED;
Query OK, 0 rows affected (0.00 sec)

mysql> select @@transaction_isolation;
+-------------------------+
| @@transaction_isolation |
+-------------------------+
| READ-COMMITTED          |
+-------------------------+
1 row in set (0.00 sec)

自动提交关闭

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mysql> set @@autocommit=0;  //设置自动提交关闭
Query OK, 0 rows affected (0.00 sec)

mysql> select @@autocommit;
+--------------+
| @@autocommit |
+--------------+
|            0 |
+--------------+
1 row in set (0.00 sec)

建表语句

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CREATE TABLE `user_info_tab` (
  `id` int NOT NULL AUTO_INCREMENT,
  `user_name` varchar(255) DEFAULT NULL,
  `age` int DEFAULT NULL,
  `city` varchar(255) DEFAULT NULL,
  `status` varchar(4) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`),
  UNIQUE KEY `idx_user_name` (`user_name`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1570072 DEFAULT CHARSET=utf8mb3;

初始化数据(接下来的实验证明,都是基于这几条初始数据)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
insert into user_info_tab(`user_name`,`age`,`city`,`status`) values('杰伦',18,'深圳','1');
insert into user_info_tab(`user_name`,`age`,`city`,`status`) values('奕迅',26,'湛江','0');
insert into user_info_tab(`user_name`,`age`,`city`,`status`) values('俊杰',28,'广州','1');

MYSQL 版本

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mysql> select @@version;  
+-----------+
| @@version |
+-----------+
| 8.0.31    |
+-----------+
1 row in set (0.00 sec)

2.RC 隔离级别

2.1 RC隔离级别 + 唯一索引

先把隔离级别设置为RC,因为user_name为唯一索引,我们使用user_name为条件去执行select......for update语句,然后开启另外一个事务去更新数据同一条数据,发现被阻塞了。如下图:

事务二的更新语句为什么会阻塞呢?

因为事务一的select......for update已经加了锁了嘛。那加的是行锁还是表锁呢? 如果加的是表锁的话,我们更新其他行的记录的话,应该是也会阻塞的,如果是行锁的话,更新其他记录是可以顺利执行的。

大家可以再看下这个图:

通过实验,可以发现:如果事务中是更新其他行记录的话,是可以顺利执行的。因此在RC隔离级别下,如果条件是唯一索引,那么select......for update加的应该是行锁

有些小伙伴会很好奇,到底加了什么锁呢? 接下来带大家看看,具体加的是什么锁。

我用的MySQL版本是8.0+,用这个语句查看:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT * FROM performance_schema.data_locks\G;

如下图,select * from user_info_tab where user_name ='杰伦' for update语句一共加了三把锁,分别是 IX意向排他锁(表级别的锁,不影响插入)、两把X排他锁(行锁,分别对应唯一索引,主键索引)

有些读者朋友说,这里不是加了IX表锁嘛?为什么不阻塞其他行的更新? 其实这个是意向排他锁

意向排他锁:简称IX锁,当事务准备在某条记录上加上X锁时,需要在表级别加一个IX锁。如select ... for update,要给表设置IX锁;

那既然有表锁,为啥事务二在执行其他行的更新语句时,并不会阻塞,这是因为:意向锁仅仅表明意向的锁,意向锁之间不会互斥,是可以并行的。,锁的兼容性如下:

有些小伙伴可能还有疑问,为啥会有两把的X锁呢? 不是都锁住的是同一行嘛?其实RC隔离级别下,唯一索引的加锁是这样的:

为什么不是唯一索引上加X锁就可以了呢?为什么主键索引上的记录也要加锁呢?

如果并发的一个SQL,通过唯一索引条件,来更新主键索引update user_info_tab set user_name = '学友' where id = '1570068';此时,如果select...for update语句没有将主键索引上的记录加锁,那么并发的update就会感知不到select...for update语句的存在,违背了同一记录上的更新/删除需要串行执行的约束。

大家如果对于锁这块基础知识,还是有疑问的话,可以看下我之前的这篇文章哈:两万字详解!InnoDB锁专题!

2.2 RC 隔离级别 + 主键

RC 隔离级别下,如果select......for update的查询条件是主键id,加的又是什么锁呢?

我们执行语句:select * from user_info_tab where id ='1570070' for update;然后开启另外一个事务去更新数据同一条数据,发现被阻塞了。如下图:

如果事务二更新的是其他行的记录,则是可以顺利执行的,如下图:

通过实验,可以发现:

如果事务中是更新其他行记录的话,是可以顺利执行的。因此在RC隔离级别下,如果条件是主键,那么select......for update锁的也是行

根据2.1小节的结论,select......for update都会加个表级别的IX意向排他锁。所以,查询条件是id的话,select......for update会加两把锁,分表是IX意向排他锁(表锁,不影响插入)一把X排他锁(行锁,对于主键索引)

我们执行语句,查询一下到底加的是什么锁。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
begin;
select * from user_info_tab where id ='1570070' for update;
SELECT * FROM performance_schema.data_locks\G;

因此在RC隔离级别下,如果条件是主键,那么select......for update加的就是两把锁,一把IX意向排他锁(不影响插入),一把对应主键的X排他锁(行锁,会锁住那一行)。

2.3 RC 隔离级别 + 普通索引

RC 隔离级别下,如果select......for update的查询条件是普通索引,加的又是什么锁呢?

我们这里先给原来表加上普通索引:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
alter table user_info_tab add index idx_city (city);

我们执行语句:select * from user_info_tab where city ='广州' for update;然后开启另外一个事务去更新同一条数据,发现被阻塞了。如下图:

如果事务二更新的是其他行的记录,还是可以顺利执行的,如下图:

我们看一下select * from user_info_tab where city ='广州' for update;到底加了什么锁,如下图:

发现一共加了三把锁,分别是:IX意向排他锁(表锁)两把X排他锁(行锁,分别对应普通索引的X锁,对应主键的X锁)

如果查询条件,没有命中数据库表的记录又加什么锁呢?

我们把查询条件改一下:select * from user_info_tab where city ='广州' and status='0' for update;

发现只加了一把锁,即IX意向排他锁(表锁,不影响插入)

2.4 RC 隔离级别 + 无索引

RC 隔离级别下,如果select......for update的查询条件是无索引呢,加的又是什么锁呢?

多数读者凭感觉都是锁表了,我们来验证一下。

我们执行语句:select * from user_info_tab where age ='26' for update;(age是没有加索引的),然后开启另外一个事务去更新数据。如下图:

由上图可以发现,事务一 先执行select......for update,然后事务二先更新别的行,发现可以顺利执行,如果执行for update的同一行,还是会阻塞等待

可推出结论,select......for update的查询条件是无索引,主要还是行锁。我们看下具体的加锁情况:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT * FROM performance_schema.data_locks\G;

发现一共加了两把锁,分别是:IX意向排他锁(表锁)一把X排他锁(行锁,对应主键的X锁)

这个为啥呢?为什么不是一个锁表的X锁呢? 这是因为:

age列上没有索引,MySQL会走聚簇(主键)索引进行全表扫描过滤。每条记录都会加上X锁。但是,为了效率考虑,MySQL在这方面进行了改进,在扫描过程中,若记录不满足过滤条件,会进行解锁操作。同时优化违背了2PL原则。

3.RR 隔离级别

3.1 RR隔离级别 + 唯一索引

如果是RR(可重复)的数据库隔离级别呢,select......for update的查询条件是唯一索引的话,加的又是什么锁呢?

我们知道RR隔离级别RC隔离级别,主要差异还是有间隙锁这个概念。接下来我们还是通过实验去验证,先把数据库隔离级别设置为RR

mysql> set global transaction isolation level repeatable read; (设置完好像要重启一下) Query OK, 0 rows affected (0.00 sec)

我们执行语句:select * from user_info_tab where user_name ='杰伦' for update;user_name是唯一索引的),然后开启另外一个事务去更新数据。如下图:

由上图可以发现,即使是RR数据库隔离级别,事务一先执行select......for update,然后事务一先更新别的行,发现可以顺利执行,如果执行更新for update的那一行,还是会阻塞超时

再去看下具体加了什么锁:

大家可以发现,不管是RC隔离级别还是RR隔离级别select......for update,查询条件是唯一索引,命中数据库表记录时,一共会加三把锁:一把IX意向排他锁 (表锁,不影响插入),一把对应主键的X排他锁(行锁),一把对应唯一索引的X排他锁 (行锁)

3.2 RR 隔离级别 + 主键

如果是 RR(可重复读)的数据库隔离级别,select......for update的查询条件是主键的话,加的又是什么锁呢?

根据前面的实验结果,我们其实可以推测得出来了,应该跟RC隔离级别一样,会加两把锁:一把IX意向排他锁(表锁,不影响插入),一把对应主键的X排他锁(行锁,影响对应主键那一行的插入)。

我们通过语句确认一下,先输入一下语句:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
begin;
select * from user_info_tab where id ='1570070' for update;
SELECT * FROM performance_schema.data_locks\G;

大家可以看下,跟我们的推测是一样的:

3.3 RR 隔离级别 + 普通索引

在RR隔离级别下,如果select......for update的查询条件是普通索引的话,除了会加X锁,IX锁,还会加Gap 锁

Gap锁的提出,是为了解决幻读问题引入的,它是一种加在两个索引之间的锁。

我们来验证一下,先开始事务一,执行一下操作:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
begin;
select * from user_info_tab where city ='广州' for update;

接着开启事务

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
begin;
insert into user_info_tab(`user_name`,`age`,`city`,`status`) values('方燕',27,'汕头','1');

验证流程图如下:

大家可以发现,插入新记录,会被阻塞,那是因为有间隙锁的缘故,我们再看下到底加了哪些锁:

发现相对于RC隔离级别,确实多了间隙锁,锁住范围了。我画了这种场景的加锁示意图,大家可以看一下:

如果要插入汕头城市的记录,会被Gap锁锁住了,因此会阻塞。

因此,在RR隔离级别下,如果select......for update的查询条件是普通索引的话,命中查询记录的话,除了会加两把X锁(行锁),IX锁(表锁,不影响插入),还会加Gap 锁(间隙锁,会影响插入)

大家如果对间隙锁这块不是很熟悉的话,可以看下我以前的这篇文章哈,两万字详解!InnoDB锁专题!

3.4 RR隔离级别 + 无索引

在RR隔离级别下,如果select......for update的查询条件是无索引的话,会锁全表嘛?来一起验证一下

我们直接按顺序执行以下这些语句:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
begin;
select * from user_info_tab where age ='26' for update;
select OBJECT_NAME,INDEX_NAME, LOCK_TYPE,LOCK_MODE, LOCK_STATUS, LOCK_DATA FROM performance_schema.data_locks;

可以发现加了这么多锁:

一共把锁,这个IX锁(表级别,意向排他锁),我们可以理解,跟前面几个例子的一样。后面三把行锁,就是把每一行的数据记录,都加了X排他锁(行锁,锁的对象对应于主键Id),我们也可以理解。 但是这个第二行,是一把怎么样的X锁呢?

我谷歌了一下,什么是supremum pseudo-record,找到了这个解释:

For the last interval, the next-key lock locks the gap above the largest value in the index and the “supremum” pseudo-record having a value higher than any value actually in the index. The supremum is not a real index record, so, in effect, this next-key lock locks only the gap following the largest index value.

翻译过来,大概意思就是:相当于比索引中所有值都大,但却不存在索引中,相当于最后一行之后的间隙锁。我理解就是如果查询条件有索引的话,类似于一个(索引最大值,+无穷)的虚拟间隙锁。

但是因为我们的查询字段age并没有索引,锁为X锁,lock_data值为supremum pseudo-record,它表示:全表行锁要走聚簇索引进行全部扫描

也就是说RR隔离级别下,对于select......for update查询条件无索引的话,会加一个IX锁(表锁,不影响插入),每一行实际记录行的X锁,还有对应于supremum pseudo-record虚拟全表行锁。这种场景,通俗点讲,其实就是锁表了

我们来做个实验,验证虚拟全表行锁的存在,先开启事务一,执行:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
begin;
select * from user_info_tab where age ='26' for update;

然后开启事务二,执行一个插入语句:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
begin;
insert into user_info_tab(id,`user_name`,`age`,`city`,`status`) values(1,'小明',31,'北京','1');

大家可以看下,阻塞了,:

加餐

都写到这里了,大家有没有发现,田螺哥列举RR数据库隔离级别的例子,select......for update条件都是命中数据库表记录的。在这里,田螺哥给大家出道题。在RR隔离级别下,如果select......for update的查询条件,是没命中当前数据表记录的话,又加什么锁呢?

我们来搞点刺激的,select......for update 搞两个条件:一个唯一索引(user_name) + 一个无索引(status),然后没命中当前数据表记录,你觉得会加什么锁呢?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CREATE TABLE `user_info_tab` (
  `id` int NOT NULL AUTO_INCREMENT,
  `user_name` varchar(255) DEFAULT NULL,
  `age` int DEFAULT NULL,
  `city` varchar(255) DEFAULT NULL,
  `status` varchar(4) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`),
  UNIQUE KEY `idx_user_name` (`user_name`) USING BTREE,
  KEY `idx_city` (`city`)
) ENGINE=InnoDB AUTO_INCREMENT=1570074 DEFAULT CHARSET=utf8mb3

我们按顺序执行者几条语句:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
begin;
select * from  user_info_tab  where user_name ='杰伦'  and status ='0'  for update ;
select OBJECT_NAME,INDEX_NAME, LOCK_TYPE,LOCK_MODE, LOCK_STATUS, LOCK_DATA FROM performance_schema.data_locks;

最后

我是捡田螺的小男孩。通过本文,大家学到哪些知识点呢?

  1. select......for update在不同场景,都加了什么锁
  2. 如何查看一个SQL 加了什么锁 (执行完原生SQL,再执行SELECT * FROM performance_schema.data_lock
  3. 如何手写个死锁 (分别开两个事务,制造锁冲突,文章的例子,好多都是死锁的case)

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
photoshop学习笔记
窗口——工作区——复位基本功能:让软件界面恢复到默认的标准状态 所有的控制面板都在窗口菜单中,可以对其进行隐藏和显示 按下TAB键可以隐藏或显示工具箱,属性栏,控制面板 按下SHIFT+TAB键,可以只隐藏控制面板 新建文档: 基于互联网设计(屏幕显示):单位:像素,分辨率:72,颜色模式:RGB 基于印刷设计时:单位:毫米MM,分辨率:300,颜色模式:CMYK (一)矩形选框工具(椭圆选框)M 按SHIFT键可以强制为正方形(正圆) 按ALT键可以保持中心点不变 同时按下SHIFT+ALT键,可保持中心不变强制为正方形(正圆) (二)背景色 前景色填充:ALT+DELETE(删除) 背景色填充:CTRL+DELETE(删除) 按D键,恢复到默认的黑白色 按X键,前背景色的切换 (三)移动工具V 功能:移动对象 复制:按下ALT键用移动工具进行拖拽 (四)图层 新建图层:CTRL+ALT+SHIFT+N 图层编组:CTRL+G (五)保存和打开 保存:CTRL+S 可以把内容存储起来 另存为:CTRL+SHIFT+S,把文件重新保存一份 默认的格式:PSD(源文件格式) 打开的方式:CTRL+O 把文档拖拽至软件中也可以打开 (六):移动选取与移动内容的区别 移动选区:绘制选区后,用矩形选框工具指在选区内,会出现白色箭头,可以移动选区。(属性栏中必须选 中的新选区) 移动内容:绘制选区后,用移动工具指在选区内,会出现黑色箭头,可以移动选区内的内容。 (七)选区的修改 边界:会得到有一定宽度的环形区域,会有羽化效果 平滑:把直角选区变成圆角选区 扩展:均匀的扩大选区 收缩:均匀的缩小选区 (八)自由变换CTRL+T 按下SHIFT键,保持比例不变 按下ALT键,保持中心不变 调整四个角点可以调整整体比例,调整四个边点可以调整宽度和高度 按下SHIFT加工具本身的快捷键,可以切换选中的工具 CTRL+k:首选项 (九)羽化SHIFT+F6 羽化:让边缘变得柔和,半透明 选区的布尔运算:加选区,减选区,与选区相交 载入选区:按下CTRL键,点击图层缩略图可得到相应的选区 (十)常用快捷键 取消选区:CTRL+D 第一步撤销CTRL+Z,第二步以上的撤销CTRL+ALT+Z)默认撤销步数为20步。 放大:CTRL+”+” 缩小:CTRL+”-” 抓手工具:空格 CTRL+J:通过拷贝的图层(复制图层) 橡皮擦工具:E
HUC思梦
2020/09/03
3.4K0
2020版PS快捷键_ps应用快捷键大全
说明:为避免篇幅过大,本文快捷键是基于Windows系统下Photoshop 2020版本的。Mac系统下的快捷键可按以下方式进行对应:Ctrl→Command,Alt→Option。有不能对应的,本文会给出说明。部分项目附加英文是为了方便记忆快捷键。
全栈程序员站长
2022/11/11
1.7K0
2020版PS快捷键_ps应用快捷键大全
关于前端的photoshop初探的学习笔记
写在前边 这还是高三的时候暑假的时候学习这个软件时记的笔记呢,今天又在电脑上找到了它,总觉得不应该让他尘封在我的硬盘上,于是挂了出来。 温馨提示:比较乱,写给自己看的,看不下去,按ctrl+W 笔记内容 ps简介 可以用于合成。 可以三维 adobe bridge图像浏览器 可以直接将图片拖动到ps的编辑系统中。。但是是出于临时文件状态,还需要对他进行保存。。 网站上某些图片不能够拉动,但是可以利用截图功能来实现。。 两张图片同时拉倒一个文件中构成两个不同的图层。。打开文件的几种方法。。 ps数
Angel_Kitty
2018/04/09
2.4K0
数码照片处理基本技法
数码照片的大小和质量与其像素的大小和分辨率有密切关注。CS6在编辑图像之前,先设置图像的大小分辨率。
Java架构师必看
2021/03/22
1.2K0
数码照片处理基本技法
ps快捷键
基础操作: ctrl+0=显示全图; ctrl+=放大; ctrl-=缩小; ctrl+j:复制当前图层到一个新层 ; ctrl+1 =实际像素显示。
mcxfate
2020/08/01
4.2K0
【PS学习记录】污点修复工具 修复画笔工具 修补工具 内容感知移动工具
3.内容识别:点击需要修复的区域。软件会自动在他的周围进行取样,通过计算对其进行光线和明暗的匹配,并进行羽化融合
KEVINGUO_CN
2020/03/16
2.8K0
Adobe PS快捷键
PS快捷键是Photoshop为了提高绘图速度定义的快捷方式,它用一个或几个简单的字母来代替常用的命令。 多种工具共用一个快捷键的可同时按【Shift】加此快捷键选取;查看键盘所有快捷键:【Ctrl】+【Alt】+【Shift】+【K】。 工具使用快捷键 矩形、椭圆选框工具:【M】 套索、多边形套索、磁性套索:【L】 橡皮擦工具:【E】 裁剪工具:【C】 仿制图章、图案图章:【S】 画笔修复工具、修补工具:【J】 添加锚点工具:【+】 移动工具:【V】 历史记录画笔工具:【Y】 模糊
Vicsh
2018/05/16
7970
Photoshop ps 快捷键
ctrl+shift+n 新建图层 ctrl+alt+shift+t  再次变化应用(附加新图层) crtl+e  合并图层 ctrl+t  快速缩放、自由变换  ctrl+j  快速贴入图层(选区内的画面为内容新建一个图层) 【 或】 画笔放大缩小(失灵时,ctrl+ 空格) crtl+shift+i  反向选择 ctrl+D  取消选区选择 ctrl+鼠标左键选择图层选区  载入选区 空格键拖动  选区没画好空格键拖动 区域内拖动  已经画好选区了 alt+鼠标滚轮、ctrl+加号 ctrl + 加/减
卓越笔记
2023/02/18
9040
Photoshop ps 快捷键
一些实用的Photoshop快捷键
将所选文本的文字大小减小10 点像素 【Ctrl】+【Alt】+【Shift】+【<】
半夜喝可乐
2018/10/17
1.8K0
一些实用的Photoshop快捷键
PS干货分享--全版本下载 ps最新软件安装包
各版本软件获取:http://jiaocheng8.top/ps.html?0idshjbdg 干货分享: PS 怎么把字去掉不伤背景?使用抠图软件来将字进行去除,不仅会花费大量时间,而且会将背景或
木子学Lee
2023/03/02
1.4K0
PS干货分享--全版本下载 ps最新软件安装包
20种常用的 Ps技术
一种简单的数码照片后期润饰 1 打开图片,执行色像/饱和度(-40)降低饱和度。 2 新建一图层,将图层模式改为柔光,用画笔工具将需要润饰的部分画几下,这里可以利用色板方便的提取颜色 3 图片色彩过渡不够柔和,再执行一下滤镜下面的高斯模糊(+85)
WindCoder
2018/09/20
2.7K0
快速批量去除图片水印方法大全~~
去水印是不复杂啦,可几千页下来,自己用橡皮抹会抹抽筋的吧~~~哈哈哈,下边记录一下偶的心路过程~~~(汗,一副盗版光荣的样子,RP真是越来越差-_-!!) 所用软件:Adobe acrobat professional 7.0 和Adobe photoshop CS2 1。本来就是扫描之后存出来的PDF嘛,所以就用PRO7.0里的导出图片功能把所有的单页转回成图片先,自动按顺序命名,存在文件夹A中。 2。用CS2随便打开其中一页,例如第49页—用“吸管”工具选中那个水印的颜色为前景色。 3。CS菜单—窗口—勾选“动作”—出来个动作的小窗口。 4。动作—新建动作—命名为“去水印”—-开始“记录”(是为了以后那几千多页的,电脑傻的只会重复呢) 5。现在开始处理那第49页。菜单—选择—色彩范围—-颜色容差里偶写90(吼吼,可以变的啦,以选出那个大水印的全部颜色但是不会选中跟水印重复的字体颜色为标准)—-按“确定”。 6。菜单—选择—扩大选取(不然会有水印框框留在原处的) 7。按DELETE键删除选中的水印。(或者编辑—填充白色,反正弄完了看不见水印就好) 8。菜单–文件—存储为WEB所用格式JPG(黑白页面品质低点也没啥影响,反正一页变小点,一本书下来就轻便不少呢~~)—存到文件夹B。 9 动作小窗口—停止记录 10。文件—自动—批处理—源文件夹就选存有水印的文件夹A,目标文件就选处理好了没水印的文件夹B,错误嘛,“选记录到文件”,随便建个记事本文件记好了。 按了确定之后呢,就该聊天的聊天,该打牌的打牌咯,想睡觉的也可以去睡觉,哈哈哈哈哈哈,反正PS好之后自然会停止的。PRO7.0里就有从多个文件创建一个PDF的选项,可惜速度慢了点,闲的话就下个软件image2PDF啥的,西西,很容易就又整合成书了~~~
全栈程序员站长
2022/07/23
3K0
快速批量去除图片水印方法大全~~
Adobe Photoshop 2020软件安装教程--所有PS软件全版本!
在这新版本中,Adobe从命名上就做出了新的改变,去除了用了七八年的CC,新版直接就叫做Adobe Photoshop 2020。
用户10295662
2023/01/10
1.7K0
ps技巧第一章 原
1. 右击图层,选择转换为智能对象,然后选择滤镜 模糊 高斯模糊2像素 2. 选中图层的智能滤镜,然后设置前景色为黑色,选择硬度为0画笔工具进行部分涂抹,使图像清晰(或者使用渐变工具拖动)
tianyawhl
2019/04/04
4660
2020PS平面设计快捷键最新最全使用攻略
注意:【选择工具】的”自动选择“是没有勾选的,如果已经勾选,那么不需要加入Ctrl,直接按Shift来进行多选。
有趣的p图姐
2020/04/15
2.5K0
ps学习经验心得分享【萧蕊冰】
哈喽~我又来啦~今天我要来分享ps学习经验心得。从小了看,在UI设计中,PS软件是我们必备的软件之一;往大了说。PS不仅UI设计会用到,什么平面设计、工业设计、电商设计等等,跟设计相关的都会用到,所以PS是一个万能软件哈哈,那今天这篇萧蕊冰讲的就是ps学习经验心得分享。
萧蕊冰
2020/06/22
8100
PS技巧方法==软件安装包Photoshop最新版本下载安装
Photoshop是一款非常好用的图像编辑软件,很多小伙伴在遇到有图片需要进行编辑 工作 时,都会使用这款软件进行操作,但是也不妨有许多新手同学们第一次使用这款软件,软件强大的功能让他们有些不知如何操作,那么今天小编就为大家带来一种PS里 抠图 的步骤分享,希望使用这款软件的新用户们能从中学到更多关于Photoshop的知识!
木子学Lee
2023/03/26
1.1K0
PS技巧方法==软件安装包Photoshop最新版本下载安装
ps工具栏快捷键大全-详细介绍5种PS中常用的抠图技巧,助你快速抠出你想要的区域
  抠图是图像处理中最常做的操作之一,也是中最为常用的技术之一。抠图其实并不难,只要你有足够的耐心和细心,只须掌握PS中一些基础知识就能完美的抠出图片。本文详细介绍PS种常用的5种抠图技术,分别是利用魔术棒工具、快速选择工具、磁性套索工具、多边形套索工具 、内容识别填充进行抠图,助你快速抠出你想要的区域。
宜轩
2022/12/29
1.4K0
exposure2023最新版Ps滤镜磨皮插件
滤镜插件是ps的重要功能之一,它主要是用来制作不同的图片特效。那么,ps滤镜插件哪些好用,ps滤镜插件如何获取,下面我们一起来学习这些内容。
用户7442547
2022/11/22
1.4K0
小明加密通道进入_如何利用PS通道去除面部雀斑
今天,教大家如何去除雀斑,美颜,教程主要包括了对图层通道、滤镜的高反差保留,污点修复画笔工具,以及曲线等效果的应用。
全栈程序员站长
2022/07/05
2K0
小明加密通道进入_如何利用PS通道去除面部雀斑
相关推荐
photoshop学习笔记
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验