MySQL——事务与存储过程(一)事务管理(4)事务的隔离级别

news2024/9/27 12:18:21

        数据库是多线程并发访问的,所以很容易出现多个线程同时开启事务的情况,这样就会出现脏读、重复读以及幻读的情况,为了避免这种情况的发生,就需要为事务设置隔离级别。在 MySQL 中,事务有4种隔离级别,接下来将针对这4种隔离级别进行详细的讲解 。

1、READ UNCOMMITTED

        READ UNCOMMITTED(读未提交)是事务中最低的级别,该级别下的事务可以读取到另一个事务中未提交的数据,也被称为脏读(Dirty Read),这是相当危险的。由于该级别较低,在实际开发中避免不了任何情况,所以一般很少使用。

2、READ COMMITTED

        大多数的数据库管理系统的默认隔离级别都是 READCOMMITTED(读提交)(如Oracle),该级别下的事务只能读取其他事务已经提交的内容,可以避免脏读,但不能避免重复读和幻读的情况。重复读就是在事务内重复读取了别的线程已经提交的数据,但两次读取的结果不一致,原因是查询的过程中其他事务做了更新的操作。幻读是指在一个事务内两次查询中数据条数不一致,原因是查询的过程中其他的事务做了添加操作。这两种情况并不算错误,但有些情况是不符合实际需求的,后面会具体讲解。

3、REPEATABLE READ

        REPEATABLE READ(可重复读)是 MySQL默认的事务隔离级别,它可以避免肘读、不可重复读的问题,确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。但理论上,该级别会出现幻读的情况,不过 MySQL的存储引擎通过多版本并发控制机制解决了该问题,因此该级别是可以避免幻读的。

4、SERIALIZABLE

        SERIALIZABLE(可串行化)是事务的最高隔离级别,它会强制对事务进行排序,使之不会发生冲突,从而解决脏读、幻读、重复读的问题。实际上,就是在每个读的数据行上加锁。这个级别,可能导致大量的超时现象和锁竞争,实际应用中很少使用。

        上述的4种级别可能会产生不同的问题,如脏读、重复读、幻读、耗时的操作等,接下来就分别演示这几种情况,具体如下。

1、脏读

        所谓的脏读就是指一个事务读取了另外一个事务未提交的数据。试想一下,a账户要给b账户转账 100 元购买商品,如果a账户开启了一个事务,执行了下面的 UPDATE语句做了转账的工作。

UPDATE account SET money=money-100 WHERE name='a';
UPDATE account SET money=money+100 WHERE name='b';

        如果a账户先不提交事务,通知b账户来查询,由于b的隔离级别较低,此时就会读到a事务中未提交的数据,发现a确实给自己转了 100元,然后给a发货,等b发货成功后a就将事务回滚,此时,b就会受到损失,这就是脏读造成的。

        为了演示上述情况,首先需要开启两个命令行窗口(相当于开启两个线程),分别模拟a账户和b账户,然后登录到 MySQL数据库,并将操作的数据库切换为 chaptero6,如下两张图所示。

         需要注意的是,下面所有的操作都是在这两个窗口中进行的,为了方便査看代码,将这两个窗口中的操作代码直接复制出来。

1)设置b账户中事务的隔离级别

        大家都知道 MySQL的默认隔离级别是 REPEATABLE READ(可重复读),该级别是可以避免脏读的,因此需要将b账户中事务的隔离级别设置为 READ UNCOMMITTED(读未提交),具体语句如下:

mysql> SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
Query OK, 0 rows affected (0.00 sec)

        上述语句中,SESSION 表示当前会话,TRANSACTION 就表示事务,ISOLATION表示隔离,LEVEL表示级别,READ UNCOMMITTED 表示当前的隔离级别,该语句执行成功后,使用 SELECT语句查询事务的隔离级别,结果如下:

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

        从上述结果可以看出,b账户事务的隔离级别已经被修改为READ UNCOMMITTED,来就可以演示脏读的情况。

2)演示脏读

       b账户:为了证明出现脏读的情况,首先在b账户中开启一个事务,并在该事务中查当前账户的余额信息,查询结果如下:

mysql> START TRANSACTION;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT * FROM account;
+----+------+-------+
| id | name | money |
+----+------+-------+
|  1 | a    |  1000 |
|  2 | b    |  1000 |
+----+------+-------+
2 rows in set (0.00 sec)

        a 账户:在a账户中开启一个事务,并在当前窗口中执行转账功能,具体语句如下:

START TRANSACTION;
UPDATE account SET money=money-100 WHERE name='a';
UPDATE account SET money=money+100 WHERE name='b';

        需要注意的是,此时不要提交事务,如果提交事务就无法演示出现脏读的情况。

        b账户:a账户执行完转账语句后,b账户查询当前账户,此时的查询结果如下。

mysql> SELECT * FROM account;
+----+------+-------+
| id | name | money |
+----+------+-------+
|  1 | a    |   900 |
|  2 | b    |  1100 |
+----+------+-------+
2 rows in set (0.00 sec)

        从查询结果可以看出,a账户已经成功给b账户转账了 100元钱,这是由于b账户的事务隔离级别较低,因此读取了a账户中还没有提交的内容,出现了脏读的情况,这时b误以为a账户已经转账成功了,便会给a发货,当b发货后a如果不提交事务将事务回滚,此时b就会受到损失。上述情况演示完,最后还需将a账户中的事务回滚,将b账户中的事务提交。

3)设置b账户中事务的隔离级别

        为了防止脏读发生,可以将b账户中事务的隔离级别设置为 READ COMMITED(读提交),该级别可以避免脏读,具体语句如下:

SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;

        上述语句执行成功后,b账户的隔离级别已经被设置为 READ COMMITTED。

4)验证是否出现脏读

        b账户:为了说明没有出现脏读的情况,首先要在b账户中开启一个事务,并在该事务中查询各账户的余额信息,查询结果如下:

mysql> START TRANSACTION;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT * FROM account;
+----+------+-------+
| id | name | money |
+----+------+-------+
|  1 | a    |  1000 |
|  2 | b    |  1000 |
+----+------+-------+
2 rows in set (0.01 sec)

        a账户:在a账户中重新开启一个事务,实现转账功能,具体语句如下:

START TRANSACTION;
UPDATE account SET money=money-100 WHERE name='a';
UPDATE account SET money=money+100 WHERE name='b';

        b账户:当a账户转账成功后,可以在b账户中再次查询各账户的余额信息,查询结果如下:

mysql> SELECT * FROM account;
+----+------+-------+
| id | name | money |
+----+------+-------+
|  1 | a    |  1000 |
|  2 | b    |  1000 |
+----+------+-------+
2 rows in set (0.01 sec)

        通过对比两次查询结果可以发现,b账户在同一个事务中的查询结果是一致的,并没有查询到a账户中未提交的内容,因此可以说明 READ COMMITTED 隔离级别可以避免脏读。最后分别将a账户中的事务和b账户中的事务回滚。

2.不可重复读

        所谓的不可重复读(NON-REPEATABLE READ)是指事务中两次查询的结果不义,原因是在查询的过程中其他事务做了更新的操作。例如,银行在做统计报表时,第一次查询a账户有 1000 元钱,第二次查询a账户有 900 元钱,原因是统计期间a账户取出1100元,这样就会导致多次统计报表的结果不一致。

        不可重复读和脏读有点类似,但是胜读是读取前一个事务未提交的胜数据,不可重该是在事务内重复读取了别的线程已提交的数据,对于初学者来说可能比较难以理接下来就通过案例来演示不可重复读的情况,具体步骤如下。

1)演示不可重复读

        b账户:首先在b账户中开启一个事务,然后在当前事务中查询各账户的余额信息查询结果如下:

mysql> START TRANSACTION;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from account;
+----+------+-------+
| id | name | money |
+----+------+-------+
|  1 | a    |  1000 |
|  2 | b    |  1000 |
+----+------+-------+
2 rows in set (0.01 sec)

        a账户:在a账户中不用开启事务,直接使用 UPDATE 语句执行更新操作即可,具体语句如下:

UPDATE account SET money=money-100 WHERE name='a';

        由于a账户只需要执行修改的操作,不需要保证同步性,因此直接执行 SQL 语句就可以,执行结果如下所示:

mysql> UPDATE account SET money=money-100 WHERE name='a';
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0

        使用 SELECT 语句查询a账户的余额信息,查询结果如下:

mysql> select * from account;
+----+------+-------+
| id | name | money |
+----+------+-------+
|  1 | a    |   900 |
|  2 | b    |  1000 |
+----+------+-------+
2 rows in set (0.00 sec)

        b账户:当a账户中的更新操作执行成功后,在b账户中再次查询各账户的余额,查询结果如下:

mysql> SELECT * FROM account;
+----+------+-------+
| id | name | money |
+----+------+-------+
|  1 | a    |   900 |
|  2 | b    |  1000 |
+----+------+-------+
2 rows in set (0.00 sec)

        对比b账户两次查询结果可以发现,两次查询结果是不一致的,实际上这种操作是没错的,但是如果在银行统计报表时,这种情况是不符合需求的,因为我们并不希望在一个事务中看到的查询结果不一致,这就是不可重复读。上述情况演示成功后,还是要将 b账户中的事务提交。

2)设置b账户中事务的隔离级别

        b账户:为了防止重复读的情况出现,可以将该事务的隔离级别设置为 REPEATABLEREAD(可重复读),具体语句如下:

SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;

        上述语句执行成功后,b账户事务的隔离级别被设置为 REPEATABLE READ。

3)验证是否出现不可重复读

        b账户:在b账户中,重新开启一个事务,然后使用 SELECT 语句查询当前账户的余额,查询结果如下:

mysql> START TRANSACTION;
Query OK, 0 rows affected (0.01 sec)

mysql> SELECT * FROM account;
+----+------+-------+
| id | name | money |
+----+------+-------+
|  1 | a    |   900 |
|  2 | b    |  1000 |
+----+------+-------+
2 rows in set (0.00 sec)

        a账户:在a账户中不开启事务,直接使用 UPDATE语句执行更新操作,具体如下:

UPDATE account SET money=money-100 WHERE name='a';

        使用 SELECT 语句查询各账户的余额信息,查询结果如下:

mysql> SELECT * FROM account;
+----+------+-------+
| id | name | money |
+----+------+-------+
|  1 | a    |   800 |
|  2 | b    |  1000 |
+----+------+-------+
2 rows in set (0.00 sec)

        b账户:当a账户中的 UPDATE语句执行成功后,b账户在当前事务中,再次查询各账户的余额信息,查询结果如下:

mysql> SELECT * FROM account;
+----+------+-------+
| id | name | money |
+----+------+-------+
|  1 | a    |   900 |
|  2 | b    |  1000 |
+----+------+-------+
2 rows in set (0.00 sec)

3、幻读

        幻读(PHANTOM READ)又被称为虚读,是指在一个事务内两次查询中数据条数不一致,幻读和不可重复读有些类似,同样是在两次查询过程中,不同的是,幻读是由于其他事务做了插入记录的操作,导致记录数有所增加。

        例如,银行在做统计报表时统计 account表中所有用户的总额时,此时总共有三个账户总共金额有 3000,这时新增了一个账户,并且存人了1000元,这时银行再统计时发现账户的总金额变为 4000,造成了幻读的情况。接下来就通过案例来演示幻读的情况,具体步骤如下。

1)设置b账户的隔离级别

        b账户:由于前面将事务的隔离级别设置为 REPEATABLE READ(可重复读),这种隔离级别可以避免幻读的出现,因此需要将事务的隔离级别设置得更低,下面将事务的隔离级别设置为 READ COMMITTED,具体语句如下:

SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;

        上述语句执行成功后,b账户事务的隔离级别为 READ COMMITTED。

2)演示幻读

        b账户:首先在b账户中开启一个事务,然后在当前事务中查询账户的余额信息,查询结果如下:

mysql> START TRANSACTION;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT * FROM account;
+----+------+-------+
| id | name | money |
+----+------+-------+
|  1 | a    |   800 |
|  2 | b    |  1000 |
+----+------+-------+
2 rows in set (0.00 sec)

        对比b账户两次查询结果可以发现,两次查询结果是不一致的,实际上这种操作是没错的,但是如果在银行统计报表时,这种情况是不符合需求的,因为我们并不希望在一个事务中看到的查询结果不一致,这就是不可重复读。上述情况演示成功后,还是要将 b账户中的事务提交。

        a账户:在对a账户进行添加操作之前,使用 SELECT 语句查看当前a账户中的信息,执行语句如下所示:

mysql> SELECT * FROM account;
+----+------+-------+
| id | name | money |
+----+------+-------+
|  1 | a    |   800 |
|  2 | b    |  1000 |
+----+------+-------+
2 rows in set (0.00 sec)

        接下来对a账户进行添加操作,a账户不用开启事务,直接执行添加操作即可,具体语句如下:

INSERT INTO account(name, money) VALUES('c',1000);

        b账户:当a账户添加记录成功后,可以在b账户中再次查询账户的余额信息,查询结果如下:

mysql> SELECT * FROM account;
+----+------+-------+
| id | name | money |
+----+------+-------+
|  1 | a    |   800 |
|  2 | b    |  1000 |
|  3 | c    |  1000 |
+----+------+-------+
3 rows in set (0.00 sec)

        通过对比b账户设置 READ COMMITTED 隔离级别前后,发现第二次查询数据时3 rows in set (0.00 sec)第一次査询时多了一条记录,这种情况并不是错误的,但可能不符合实际需求。需要注意的是,上述情况演示完成后,将b账户中的事务提交。

3)重新设置b账户的隔离级别

        b账户:为了防止出现幻读,可以将b账户的隔离级别设置为REPEATABIREAD,具体语句如下:

SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;

        上述语句执行成功后,事务的隔离级别被设置为 REPEATABLE READ。

4)验证是否出现幻读

        b账户:在b账户中重新开启一个事务,并在该事务中查询当前账户的余额信息,询结果如下:

mysql> START TRANSACTION;
Query OK, 0 rows affected (0.01 sec)

mysql> SELECT * FROM account;
+----+------+-------+
| id | name | money |
+----+------+-------+
|  1 | a    |   800 |
|  2 | b    |  1000 |
|  3 | c    |  1000 |
+----+------+-------+
3 rows in set (0.01 sec)

        a账户:在对a账户进行添加操作之前,使用 SELECT 语句查看当前a账户中的信息,执行语句如下所示:

mysql> SELECT * FROM account;
+----+------+-------+
| id | name | money |
+----+------+-------+
|  1 | a    |   800 |
|  2 | b    |  1000 |
|  3 | c    |  1000 |
+----+------+-------+
3 rows in set (0.01 sec)

        接下来对a账户进行添加操作,在a账户中不开启事务,直接执行添加操作,具体语句如下:

INSERT INTO account(name, money) VALUES('d',1000);

        b账户:当a账户的添加操作执行成功后,再次查询当前账户的余额信息,查询结果如下:

mysql> SELECT * FROM account;
+----+------+-------+
| id | name | money |
+----+------+-------+
|  1 | a    |   800 |
|  2 | b    |  1000 |
|  3 | c    |  1000 |
+----+------+-------+
3 rows in set (0.00 sec)

        对比b账户的两次查询结果可以看出,在同一个事务中两次的查询结果是一致的并没有出现重复读取的情况,因此可以说明当前事务的隔离级别可以避免幻读,最后还需要使用 COMMIT 语句提交当前事务,提交后的账户查询结果如下所示:

mysql> SELECT * FROM account;
+----+------+-------+
| id | name | money |
+----+------+-------+
|  1 | a    |   800 |
|  2 | b    |  1000 |
|  3 | c    |  1000 |
|  4 | d    |  1000 |
+----+------+-------+
4 rows in set (0.00 sec)

4、可串行化

        可串行化(SERIALIZABLE)是事务的最高隔离级别,它在每个读的数据行上加上锁,使之不可能相互冲突,因此会导致大量的超时现象,接下来通过具体的案例来演示,具体步骤如下: 

1)设置b账户中事务的隔离级别

        b账户:首先将b账户的隔离级别设置为 SERIALIZABLE,具体语句如下:

SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;

        上述语句执行成功后,当前事务的隔离级别被成功设置为 SERIALIZABLE。

2)演示可串行化器声息

        b账户:首先在b账户中开启事务,然后使用 SELECT语句查询各个账户的余额信息,查询结果如下:

mysql> START TRANSACTION;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT * FROM account;
+----+------+-------+
| id | name | money |
+----+------+-------+
|  1 | a    |   800 |
|  2 | b    |  1000 |
|  3 | c    |  1000 |
|  4 | d    |  1000 |
+----+------+-------+
4 rows in set (0.00 sec)

        a账户:开启一个事务,并在该事务中执行插入操作,执行结果如下:

mysql> START TRANSACTION;
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO account(name,money)VALUES('e',1000);
Query OK, 1 row affected (0.00 sec)

        从上述执行结果可以看出,当b账户正在事务中查询余额信息时,a账户中的操作是不能立即执行的。

3)提交事务

        b账户:当b账户查询完余额信息后,立即提交当前事务,具体语句如下:

COMMIT;

        a账户:当b账户中的事务提交成功后,a账户中的添加操作才能执行成功,并输出如下语句:

Query OK, 1 row affected(0.00 sec)

        从上述情况可以说明,如果一个事务使用了 SERIALIZABLE(可串行化)隔离级别时,在这个事务没有被提交前,其他的线程只能等到当前操作完成后,才能进行操作,这样会非常耗时,而且会影响数据库的性能,通常情况下是不会使用这种隔离级别的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2089416.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux安装Docker与基本指令

1、什么是Docker Dokcer是一种开源平台,主要用于创建、部署和管理容器化应用程序,它通过将应用程序以及所有的依赖打包到一个轻量级的、可移植的容器中,使得应用可以在任何环境中一致的运行! 1.1、Docker的优点 一致性和可移植性 跨环境一致…

删除微信重复文件的简易工具

去我的个人博客观看,观感更佳哦,😙😙 前言 !!!!温馨提示:假如你是小白,啥都不懂,请直接跳到文章的最后!!! 原本我是没想写这篇文章,契机是某一天我突然打开微信的存储空间占用才发…

5款手机版的影视解说文案生成器,无须下载更方便!

在这个自媒体的红利时期,影视解说创作占据了内容创作的很大一部分。而影视解说文案则是帮助观众更好地理解和欣赏影视作品的重要点。随着手机的普及,越来越多的人希望能够在手机上方便地生成影视解说文案创作。今天,我们就来介绍5款手机版的影…

Shared memory bank conflicts

共享内存和bank: 在CUDA架构中,共享内存是一个非常快速的内存类型,它位于每个线程块内部并为该线程块内的所有线程提供服务。为了实现高吞吐量的访问,共享内存被划分为多个独立的存储区域,称为“banks”。每个bank可以在单个时钟…

创新微MinewSemi推出基于Nordic nRF54系列芯片 SoC 低功耗蓝牙5.4模组

在物联网技术飞速发展的今天,创新微MinewSemi隆重推出基于Nordic最新nRF54系列芯片SoC的ME54BS01和ME54BS02全新低功耗蓝牙5.4模组。这两款模组的问世,标志着我们在推动物联网设备智能化、高效化道路上的迈出了坚实的一步,展示了对未来技术的…

回归预测|基于卷积神经网络-鲸鱼优化-最小二乘支持向量机的数据回归预测Matlab程序 CNN-WOA-LSSVM

回归预测|基于卷积神经网络-鲸鱼优化-最小二乘支持向量机的数据回归预测Matlab程序 CNN-WOA-LSSVM 文章目录 一、基本原理1. 数据预处理2. 特征提取(CNN)3. 参数优化(WOA)4. 模型训练(LSSVM)5. 模型评估和优…

World of Warcraft [CLASSIC][80][Grandel] Mount with 310% speed

310%速度的坐骑【被感染的始祖幼龙】 永恒之眼(3个) 纳克萨玛斯(9个) 10人副本, 白马 (DPS N)黑马(DPS N)绿马(T N DPS)红马(T …

诚信为金:揭秘好征信的六大黄金标准,并实践守护好它的五大秘籍

什么是好征信,怎么守护它 咱们平时总听人说“征信”,“征信”到底是个什么东西,但很少人能透彻的了解它。它是一个有点神秘但又挺重要的东西,简单说,它就是咱在金融界的一张“身份证”,记录着咱们的信用表…

【C++ Qt day3】

2、设计一个Per类,类中包含私有成员:姓名、年龄、指针成员身高、体重,再设计一个Stu类,类中包含私有成员:成绩、Per类对象p1,设计这两个类的构造函数、析构函数和拷贝构造函数。

【2024 CCF编程能力等级认证(GESP)C++ 】一级大纲

目录 1. 背景2. 考核知识块3. 考核内容3.1 计算机基础知识3.2 集成开发环境3.3 结构化程序设计3.4 程序的基本语句3.5 程序的基本概念3.6 基本运算3.7 基本数据类型4. 考核目标5. 题型分布6. 考试时长7. 认证时间与报名8. 政策与福利9. GESP一级认证形式 1. 背景 官网&#xff…

13.DataLoader 的使用

DataLoader 的使用 dataset:告诉程序中数据集的位置,数据集中索引,数据集中有多少数据(想象成一叠扑克牌)dataloader:加载器,将数据加载到神经网络中,每次从dataset中取数据&#x…

JAVA中的线程池说明二

目录 1.引入 2.参数解释 3.标准库中提供的四个拒绝策略 1.引入 java.util.concurrent 这个包里面放的很多类都是和并发编程(多线程编程)密切相关,这个包简称JUC;今天我们主要来了解Java线程池的相关知识。 2.参数解释 在这里,我们主要讲…

无痛除毛,告别异味,希喂、有哈、小米宠物空气净化器真实测评

养宠在年轻人生活中逐渐成为一种新的潮流,越来越多的人加入到铲屎官的队伍。其中,养宠最多的品类非猫咪莫属,凭借自身可爱的外表收获人们的芳心。同时猫咪也是宠物中掉毛最严重的,漫天的浮毛在家中不断飘散,带来无尽的…

Java——断点调试

一、断点调试简介 Java的断点调试是程序开发中非常重要的一个技术,它允许开发者在程序执行时暂停执行,以便检查变量的状态、观察程序的流程、并定位错误。 1、断点(Breakpoint): 在代码的某一行指定的暂停点。当程序…

个人旅游网(1)——数据库表详解

文章目录 一、数据库表详情1.1 tab_category 表1.2、tab_route 表1.3、tab_route_img 表1.4、tab_user 表1.5、tab_favorite 表1.6、tab_address 表1.7、tab_seller 表1.8、tab_order 表1.9、tab_orderItem 表 一、数据库表详情 该网站是一个旅游网站,为具有出游的需…

C程序设计(潭浩强教授版)精选程序题

目录 (一)顺序程序设计部分 (二)选择程序设计部分 (三)循环程序设计部分 (四)数组处理数据部分 (一)顺序程序设计部分 1. 使用getchar读入两个字符&#xf…

对比 PDAF、CDAF 和 LAAF 自动对焦技术

深入解析相位检测自动对焦(PDAF) 相位检测自动对焦(PDAF,Phase Detection Auto Focus)是一种高效的自动对焦技术,广泛应用于现代数码相机、无反相机和智能手机摄像头中。为了更好地理解 PDAF,我…

C++11中的lambda匿名函数

一、引言 C11中引入的lambda表达式(也称为匿名函数或lambda函数)提供了一种方便且灵活的方式来定义和使用小的匿名函数对象。这些lambda表达式在编写回调函数、操作容器的算法中、或者在需要快速定义和传递一个函数逻辑给另一个函数时特别有用。 二、基…

行得稳,跑得远,美团如何做到长期主义持续发力?

在今天这样一个充满不确定性的时代,最能确定的是什么呢?我们这一代人,有幸成为诸多历史性时刻的亲历者和见证者。在此背景下,越来越多的企业家和经营者开始关注回归经营的本质和实现稳健经营的问题。 企业的稳健经营贯穿于企业的…

联华证券-掌握尾盘买入法的多种策略与实用技巧

尾盘买入法的常见方法与具体技巧 尾盘买入法是指在股票交易日的尾盘时段(通常指收盘前的15-30分钟)进行买入操作的策略。由于尾盘时段能够反映市场全天的交易情况以及主力资金的意图,尾盘买入法在捕捉短线机会方面具有一定的优势。以下是尾盘…