相对便宜的寄快递方法
老婆开了个鞋店,经常要给客户邮寄,平时自己去快递站又麻烦又贵,在APP上面叫的快递也要8块钱,太不划算了。我们又没量,只是偶尔一两天寄一个。
后来来在网上找,找到了几家,价格可以约5块钱寄全国。
每家都试用了一下,感觉最个最方便。
把二维码贴出来备用。
老婆开了个鞋店,经常要给客户邮寄,平时自己去快递站又麻烦又贵,在APP上面叫的快递也要8块钱,太不划算了。我们又没量,只是偶尔一两天寄一个。
后来来在网上找,找到了几家,价格可以约5块钱寄全国。
每家都试用了一下,感觉最个最方便。
把二维码贴出来备用。
apt install sudo
apt install net-tools
sudo vi /etc/ssh/sshd_config
#PermitRootLogin prohibit-password
PermitRootLogin yes
sudo systemctl restart ssh
表示一个事务正在读取一行数据,其他事务也可以读取同一行数据,但不能进行写操作。
也称为 "S锁" 或 "读锁"。
典型应用场景:当一个事务需要读取数据而不修改它时,可以使用共享锁。多个事务可以同时获取共享锁,并且彼此之间不会产生冲突。
-- 在事务中获取共享锁
BEGIN TRANSACTION;
SELECT * FROM table_name WITH (TABLOCKX, HOLDLOCK) WHERE column_name = 'value';
-- 其他事务可以读取同一行的数据,但不能进行写操作
COMMIT;
表示一个事务正在对一行数据进行写操作,并阻止其他事务对同一行进行读或写操作。
也称为 "X锁" 或 "写锁"。
典型应用场景:当一个事务需要对数据进行修改或删除操作时,可以使用排他锁。该锁会阻止其他事务对同一行进行读取或写入,确保数据的一致性。
-- 在事务中获取排他锁
BEGIN TRANSACTION;
SELECT * FROM table_name WITH (XLOCK) WHERE column_name = 'value';
-- 其他事务无法读取或写入同一行的数据
COMMIT;
用于实现读取操作和避免并发更新冲突的特殊锁定模式。当一个事务使用更新锁时,其他事务也可以读取同一行数据,但不能进行写操作。
更新锁是共享锁和排他锁之间的折衷选择。
也称为 "U锁" 或 "升级锁"。
典型应用场景:在读取数据时,如果事务预计可能在稍后需要对数据进行更新操作,但目前仅需要共享访问权限,可以使用更新锁。这样可以避免读取和更新之间的竞争条件,提高并发性。
-- 在事务中获取更新锁
BEGIN TRANSACTION;
SELECT * FROM table_name WITH (UPDLOCK) WHERE column_name = 'value';
-- 其他事务可以读取同一行的数据,但不能进行写操作
COMMIT;
锁定整个表,阻止其他事务对该表的读或写操作。
表级锁可能对并发性产生较大影响,因为它限制了其他事务对表的访问。
典型应用场景:当需要对整个表进行大规模的操作,如数据重建、表结构修改等,可以使用表锁。这会阻止其他事务对表进行读取或写入操作,确保操作的完整性。
-- 在事务中获取表锁
BEGIN TRANSACTION;
SELECT * FROM table_name WITH (TABLOCKX) WHERE column_name = 'value';
-- 其他事务无法读取或写入整个表
COMMIT;
锁定表的数据页,即一组相邻的数据行。
页级锁通常用于较大的事务或特定的锁定提示。
典型应用场景:在某些情况下,表中的数据按页组织,而不是按行组织。当需要访问特定数据页时,可以使用页级锁。这可以减少锁的粒度,提高并发性能。
-- 在事务中获取页级锁
BEGIN TRANSACTION;
SELECT * FROM table_name WITH (PAGLOCK) WHERE column_name = 'value';
-- 其他事务无法读取或写入同一数据页的数据
COMMIT;
锁定表的单个数据行。
行级锁提供了最细粒度的并发控制,但也可能导致更多的锁开销和资源争用。
典型应用场景:当需要对表中的特定行进行操作时,可以使用行级锁。这允许并发事务对不同行进行读取和写入操作,提高并发性能。
-- 在事务中获取行级锁
BEGIN TRANSACTION;
SELECT * FROM table_name WITH (ROWLOCK) WHERE column_name = 'value';
-- 其他事务无法读取或写入同一行的数据
COMMIT;
此外,还存在其他一些重要的锁类型,包括:
锁定表中的一定范围的键值,通常与范围查询和索引操作相关。
键值锁用于防止并发操作引起的范围扫描和索引不一致性。
典型应用场景:当进行范围查询或索引操作时,可以使用键值锁。它可以锁定一定范围的键值,以确保范围扫描的一致性。
-- 在事务中获取键值锁
BEGIN TRANSACTION;
SELECT * FROM table_name WITH (XLOCK) WHERE column_name BETWEEN 'value1' AND 'value2';
-- 其他事务无法读取或写入指定键值范围内的数据
COMMIT;
用于指示一个事务已经在某一级别上持有锁,以阻止其他事务对更精细级别的锁定进行操作。
意向锁包括意向共享锁 (IS) 和意向排他锁 (IX)。
典型应用场景:意向锁用于指示事务在特定级别上持有锁,以避免其他事务获取冲突的更细粒度锁。它通常与其他锁类型结合使用。
-- 在事务中获取意向锁
BEGIN TRANSACTION;
SELECT * FROM table_name WITH (IS) WHERE column_name = 'value';
-- 其他事务无法获取排他锁(X锁)
COMMIT;
允许多个事务同时获取对同一数据行的共享更新锁,以支持并发读取和更新操作。
典型应用场景:当多个事务需要同时读取并更新同一数据行时,可以使用共享更新锁。这允许多个事务同时获取对同一数据行的共享更新锁,以支持并发读取和更新操作。
-- 在事务中获取共享更新锁
BEGIN TRANSACTION;
SELECT * FROM table_name WITH (SIXU) WHERE column_name = 'value';
-- 允许多个事务同时获取对同一数据行的共享更新锁,支持并发读取和更新操作
COMMIT;
这些是 SQL Server 中的一些常见和重要的锁类型,用于控制并发性和维护数据完整性。在设计和优化数据库应用程序时,了解不同类型的锁以及它们的行为和影响是至关重要的。
上述9种锁的横向对比:
锁类型 并发性 锁定粒度 锁定范围 冲突 适用场景
共享锁 (Shared Lock) 高 行级 仅限读 读冲突 并发读取,不修改数据
排他锁 (Exclusive Lock) 低 行级 整个行 读写冲突 数据修改,防止其他事务读取或写入同一行数据
更新锁 (Update Lock) 中 行级 仅限读 写冲突 并发读取,预计稍后可能需要对数据进行更新
表锁 (Table Lock) 低 表级 整个表 读写冲突 大规模操作,如数据重建、表结构修改等
页级锁 (Page Lock) 中 页级 数据页 读写冲突 针对按页组织的数据,减少锁的粒度以提高并发性能
行级锁 (Row Lock) 高 行级 单个数据行 读写冲突 针对特定行的读写操作
键值锁 (Key-Range Lock) 中 键值范围 指定键值范围 读写冲突 范围查询或索引操作
意向锁 (Intent Lock) - 数据结构级 整个数据结构 冲突解决 协调低层次锁定请求的锁
共享更新锁 (Shared Update Lock) 高 行级 单个数据行 读冲突 并发读取和更新同一行
注意:表格中的并发性指的是该锁对并发读写操作的支持程度,高表示较好的并发性能,低表示较差的并发性能。锁定粒度指的是锁定的对象粒度,可以是行、页或表级别。锁定范围指的是锁定的数据范围,可以是单个行、整个表或键值范围等。冲突表示该锁类型与其他锁类型之间可能发生的冲突。适用场景指的是每种锁类型常见的使用场景。
请注意,锁的选择取决于具体的业务需求和并发控制策略。在实际应用中,需要根据具体情况选择适当的锁
TABLOCKX:
XLOCK:
总结来说,TABLOCKX 是一种表级排他锁,阻止其他事务对整个表进行访问,而 XLOCK 是一种行级排他锁,阻止其他事务对特定行数据进行访问。选择使用哪种锁取决于具体的业务需求和并发控制策略。需要注意的是,过度使用强制性的锁定提示可能会导致并发性能下降,因此应该谨慎使用。
Cron表达式由7段构成:秒 分 时 日 月 星期 年(可选)
"-" :表示范围 MON-WED表示星期一到星期三
"," :表示列举 MON,WEB表示星期一和星期三
"*" :表是“每”,每月,每天,每周,每年等
"/" :表示增量:0/15(处于分钟段里面) 每15分钟,在0分以后开始,3/20 每20分钟,从3分钟以后开始
"?" :只能出现在日,星期段里面,表示不指定具体的值
"L" :只能出现在日,星期段里面,是Last的缩写,一个月的最后一天,一个星期的最后一天(星期六)
"W" :表示工作日,距离给定值最近的工作日
"#" :表示一个月的第几个星期几,例如:"6#3"表示每个月的第三个星期五(1=SUN...6=FRI,7=SAT)
如果Minutes的数值是 '0/15' ,表示从0开始每15分钟执行
如果Minutes的数值是 '3/20' ,表示从3开始每20分钟执行,也就是‘3分/23分/43分’
常用表达式例子
(1)0/2 ? 表示每2秒 执行任务
(1)0 0/2 * ? 表示每2分钟 执行任务
(1)0 0 2 1 * ? 表示在每月的1日的凌晨2点调整任务
(2)0 15 10 ? * MON-FRI 表示周一到周五每天上午10:15执行作业
(3)0 15 10 ? 6L 2002-2006 表示2002-2006年的每个月的最后一个星期五上午10:15执行作
(4)0 0 10,14,16 ? 每天上午10点,下午2点,4点
(5)0 0/30 9-17 ? 朝九晚五工作时间内每半小时
(6)0 0 12 ? * WED 表示每个星期三中午12点
(7)0 0 12 ? 每天中午12点触发
(8)0 15 10 ? 每天上午10:15触发
(9)0 15 10 ? 每天上午10:15触发
(10)0 15 10 ? 每天上午10:15触发
(11)0 15 10 ? 2005 2005年的每天上午10:15触发
(12)0 14 * ? 在每天下午2点到下午2:59期间的每1分钟触发
(13)0 0/5 14 ? 在每天下午2点到下午2:55期间的每5分钟触发
(14)0 0/5 14,18 ? 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发
(15)0 0-5 14 ? 在每天下午2点到下午2:05期间的每1分钟触发
(16)0 10,44 14 ? 3 WED 每年三月的星期三的下午2:10和2:44触发
(17)0 15 10 ? * MON-FRI 周一至周五的上午10:15触发
(18)0 15 10 15 * ? 每月15日上午10:15触发
(19)0 15 10 L * ? 每月最后一日的上午10:15触发
(20)0 15 10 ? * 6L 每月的最后一个星期五上午10:15触发
(21)0 15 10 ? * 6L 2002-2005 2002年至2005年的每月的最后一个星期五上午10:15触发
(22)0 15 10 ? * 6#3 每月的第三个星期五上午10:15触发