范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

程序员新人周一优化一行代码,周三被劝退?

  这周一,公司新来了一个同事,面试的时候表现得非常不错,各种问题对答如流,老板和我都倍感欣慰。
  这么优秀的人,绝不能让他浪费一分一秒,于是很快,我就发他了需求文档、源码,让他先在本地熟悉一下业务和开发流程。
  结果没想到,周三大家一块 review 代码的时候就发现了问题,新来的同事直接把原来  @Transactional  优化成了这个鬼样子: @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
  就因为这一行代码,老板(当年也是一线互联网大厂的好手)当场就发飙了,马上就要劝退这位新同事,我就赶紧打圆场,毕竟自己面试的人,不看僧面看佛面,是吧?于是老板答应我说再试用一个月看看。
  会议结束后,我就赶紧让新同事复习了一遍事务,以下是他自己做的总结,还是非常详细的,分享出来给大家一点点参考和启发。相信大家看完后就明白为什么不能这样优化 @Transactional  注解了,纯属画蛇添足和乱用。 关于事务
  事务在逻辑上是一组操作, 要么执行,要不都不执行 。主要是针对数据库而言的,比如说 MySQL。
  只要记住这一点,理解事务就很容易了。在 Java 中,我们通常要在业务里面处理多个事件,比如说编程喵有一个保存文章的方法,它除了要保存文章本身之外,还要保存文章对应的标签,标签和文章不在同一个表里,但会通过在文章表里(posts)保存标签主键(tag_id)来关联标签表(tags):  public void savePosts(PostsParam postsParam) {  // 保存文章  save(posts);  // 处理标签   insertOrUpdateTag(postsParam, posts); }
  那么此时就需要开启事务,保证文章表和标签表中的数据保持同步,要么都执行,要么都不执行。
  否则就有可能造成,文章保存成功了,但标签保存失败了,或者文章保存失败了,标签保存成功了——这些场景都不符合我们的预期。
  为了保证事务是正确可靠的,在数据库进行写入或者更新操作时,就必须得表现出 ACID 的 4 个重要特性:  原子性(Atomicity):一个事务中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。  一致性(Consistency):在事务开始之前和事务结束以后,数据库的完整性没有被破坏。  事务隔离(Isolation):数据库允许多个并发事务同时对其数据进行读写和修改,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。  持久性(Durability):事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
  其中,事务隔离又分为 4 种不同的级别,包括:  未提交读(Read uncommitted),最低的隔离级别,允许"脏读"(dirty reads),事务可以看到其他事务"尚未提交"的修改。如果另一个事务回滚,那么当前事务读到的数据就是脏数据。  提交读(read committed),一个事务可能会遇到不可重复读(Non Repeatable Read)的问题。不可重复读是指,在一个事务内,多次读同一数据,在这个事务还没有结束时,如果另一个事务恰好修改了这个数据,那么,在第一个事务中,两次读取的数据就可能不一致。  可重复读(repeatable read),一个事务可能会遇到幻读(Phantom Read)的问题。幻读是指,在一个事务中,第一次查询某条记录,发现没有,但是,当试图更新这条不存在的记录时,竟然能成功,并且,再次读取同一条记录,它就神奇地出现了。  串行化(Serializable),最严格的隔离级别,所有事务按照次序依次执行,因此,脏读、不可重复读、幻读都不会出现。虽然 Serializable 隔离级别下的事务具有最高的安全性,但是,由于事务是串行执行,所以效率会大大下降,应用程序的性能会急剧降低。如果没有特别重要的情景,一般都不会使用 Serializable 隔离级别。
  需要格外注意的是: 事务能否生效,取决于数据库引擎是否支持事务,MySQL 的 InnoDB 引擎是支持事务的,但 MyISAM 就不支持 。 关于 Spring 对事务的支持
  Spring 支持两种事务方式,分别是编程式事务和声明式事务,后者最常见,通常情况下只需要一个  @Transactional  就搞定了(代码侵入性降到了最低),就像这样: @Transactional public void savePosts(PostsParam postsParam) {  // 保存文章  save(posts);  // 处理标签   insertOrUpdateTag(postsParam, posts); }
  1)编程式事务
  编程式事务是指将事务管理代码嵌入嵌入到业务代码中,来控制事务的提交和回滚。
  你比如说,使用 TransactionTemplate 来管理事务:  @Autowired private TransactionTemplate transactionTemplate; public void testTransaction() {          transactionTemplate.execute(new TransactionCallbackWithoutResult() {             @Override             protected void doInTransactionWithoutResult(TransactionStatus transactionStatus) {                  try {                      // ....  业务代码                 } catch (Exception e){                     //回滚                     transactionStatus.setRollbackOnly();                 }              }         }); }
  再比如说,使用 TransactionManager 来管理事务:  @Autowired private PlatformTransactionManager transactionManager;  public void testTransaction() {    TransactionStatus status = transactionManager.getTransaction(new DefaultTransactionDefinition());           try {                // ....  业务代码               transactionManager.commit(status);           } catch (Exception e) {               transactionManager.rollback(status);           } }
  就编程式事务管理而言,Spring 更推荐使用 TransactionTemplate。
  在编程式事务中,必须在每个业务操作中包含额外的事务管理代码,就导致代码看起来非常的臃肿,但对理解 Spring 的事务管理模型非常有帮助。
  2)声明式事务
  声明式事务将事务管理代码从业务方法中抽离了出来,以声明式的方式来实现事务管理,对于开发者来说,声明式事务显然比编程式事务更易用、更好用。
  当然了,要想实现事务管理和业务代码的抽离,就必须得用到 Spring 当中最关键最核心的技术之一,AOP,其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,执行完目标方法之后根据执行的情况提交或者回滚。
  声明式事务虽然优于编程式事务,但也有不足,声明式事务管理的粒度是方法级别,而编程式事务是可以精确到代码块级别的 。 事务管理模型
  Spring 将事务管理的核心抽象为一个事务管理器(TransactionManager),它的源码只有一个简单的接口定义,属于一个标记接口:  public interface TransactionManager {  }
  该接口有两个子接口,分别是编程式事务接口 ReactiveTransactionManager 和声明式事务接口 PlatformTransactionManager。我们来重点说说 PlatformTransactionManager,该接口定义了 3 个接口方法:  interface PlatformTransactionManager extends TransactionManager{     // 根据事务定义获取事务状态     TransactionStatus getTransaction(TransactionDefinition definition)             throws TransactionException;      // 提交事务     void commit(TransactionStatus status) throws TransactionException;      // 事务回滚     void rollback(TransactionStatus status) throws TransactionException; }
  通过 PlatformTransactionManager 这个接口,Spring 为各个平台如 JDBC(DataSourceTransactionManager)、Hibernate(HibernateTransactionManager)、JPA(JpaTransactionManager)等都提供了对应的事务管理器,但是具体的实现就是各个平台自己的事情了。
  参数 TransactionDefinition 和 @Transactional 注解是对应的,比如说 @Transactional 注解中定义的事务传播行为、隔离级别、事务超时时间、事务是否只读等属性,在 TransactionDefinition 都可以找得到。
  返回类型 TransactionStatus 主要用来存储当前事务的一些状态和数据,比如说事务资源(connection)、回滚状态等。
  TransactionDefinition.java:  public interface TransactionDefinition {   // 事务的传播行为  default int getPropagationBehavior() {   return PROPAGATION_REQUIRED;  }   // 事务的隔离级别  default int getIsolationLevel() {   return ISOLATION_DEFAULT;  }    // 事务超时时间   default int getTimeout() {   return TIMEOUT_DEFAULT;  }    // 事务是否只读   default boolean isReadOnly() {   return false;  } }
  Transactional.java  @Target({ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Inherited @Documented public @interface Transactional {   Propagation propagation() default Propagation.REQUIRED;  Isolation isolation() default Isolation.DEFAULT;   int timeout() default TransactionDefinition.TIMEOUT_DEFAULT;   boolean readOnly() default false;  } @Transactional 注解中的 propagation 对应 TransactionDefinition 中的 getPropagationBehavior,默认值为  Propagation.REQUIRED(TransactionDefinition.PROPAGATION_REQUIRED) 。 @Transactional 注解中的 isolation 对应 TransactionDefinition 中的 getIsolationLevel,默认值为  DEFAULT(TransactionDefinition.ISOLATION_DEFAULT) 。 @Transactional 注解中的 timeout 对应 TransactionDefinition 中的 getTimeout,默认值为TransactionDefinition.TIMEOUT_DEFAULT。  @Transactional 注解中的 readOnly 对应 TransactionDefinition 中的 isReadOnly,默认值为 false。
  说到这,我们来详细地说明一下 Spring 事务的传播行为、事务的隔离级别、事务的超时时间、事务的只读属性,以及事务的回滚规则。  事务传播行为
  当事务方法被另外一个事务方法调用时,必须指定事务应该如何传播 ,例如,方法可能继续在当前事务中执行,也可以开启一个新的事务,在自己的事务中执行。
  声明式事务的传播行为可以通过 @Transactional 注解中的 propagation 属性来定义,比如说:  @Transactional(propagation = Propagation.REQUIRED) public void savePosts(PostsParam postsParam) { }
  TransactionDefinition 一共定义了 7 种事务传播行为:
  01、 PROPAGATION_REQUIRED
  这也是 @Transactional 默认的事务传播行为,指的是如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。更确切地意思是:  如果外部方法没有开启事务的话,Propagation.REQUIRED 修饰的内部方法会开启自己的事务,且开启的事务相互独立,互不干扰。  如果外部方法开启事务并且是 Propagation.REQUIRED 的话,所有 Propagation.REQUIRED 修饰的内部方法和外部方法均属于同一事务 ,只要一个方法回滚,整个事务都需要回滚。  Class A {     @Transactional(propagation=Propagation.PROPAGATION_REQUIRED)     public void aMethod {         //do something         B b = new B();         b.bMethod();     } }  Class B {     @Transactional(propagation=Propagation.PROPAGATION_REQUIRED)     public void bMethod {        //do something     } }
  这个传播行为也最好理解,aMethod 调用了 bMethod,只要其中一个方法回滚,整个事务均回滚。
  02、 PROPAGATION_REQUIRES_NEW
  创建一个新的事务,如果当前存在事务,则把当前事务挂起。也就是说不管外部方法是否开启事务,Propagation.REQUIRES_NEW 修饰的内部方法都会开启自己的事务,且开启的事务与外部的事务相互独立,互不干扰。  Class A {     @Transactional(propagation=Propagation.PROPAGATION_REQUIRED)     public void aMethod {         //do something         B b = new B();         b.bMethod();     } }  Class B {     @Transactional(propagation=Propagation.REQUIRES_NEW)     public void bMethod {        //do something     } }
  如果 aMethod()发生异常回滚,bMethod()不会跟着回滚,因为 bMethod()开启了独立的事务。但是,如果 bMethod()抛出了未被捕获的异常并且这个异常满足事务回滚规则的话,aMethod()同样也会回滚。
  03、 PROPAGATION_NESTED
  如果当前存在事务,就在当前事务内执行;否则,就执行与 PROPAGATION_REQUIRED 类似的操作。
  04、 PROPAGATION_MANDATORY
  如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。
  05、 PROPAGATION_SUPPORTS
  如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。
  06、 PROPAGATION_NOT_SUPPORTED
  以非事务方式运行,如果当前存在事务,则把当前事务挂起。
  07、 PROPAGATION_NEVER
  以非事务方式运行,如果当前存在事务,则抛出异常。
  3、4、5、6、7 这 5 种事务传播方式不常用,了解即可。  事务隔离级别
  前面我们已经了解了数据库的事务隔离级别,再来理解 Spring 的事务隔离级别就容易多了。
  TransactionDefinition 中一共定义了 5 种事务隔离级别:  ISOLATION_DEFAULT,使用数据库默认的隔离级别,MySql 默认采用的是 REPEATABLE_READ,也就是可重复读。  ISOLATION_READ_UNCOMMITTED,最低的隔离级别,可能会出现脏读、幻读或者不可重复读。  ISOLATION_READ_COMMITTED,允许读取并发事务提交的数据,可以防止脏读,但幻读和不可重复读仍然有可能发生。  ISOLATION_REPEATABLE_READ,对同一字段的多次读取结果都是一致的,除非数据是被自身事务所修改的,可以阻止脏读和不可重复读,但幻读仍有可能发生。  ISOLATION_SERIALIZABLE,最高的隔离级别,虽然可以阻止脏读、幻读和不可重复读,但会严重影响程序性能。
  通常情况下,我们采用默认的隔离级别 ISOLATION_DEFAULT 就可以了,也就是交给数据库来决定,可以通过  SELECT @@transaction_isolation;  命令来查看 MySql 的默认隔离级别,结果为 REPEATABLE-READ,也就是可重复读。
  事务的超时时间
  事务超时,也就是指一个事务所允许执行的最长时间,如果在超时时间内还没有完成的话,就自动回滚。
  假如事务的执行时间格外的长,由于事务涉及到对数据库的锁定,就会导致长时间运行的事务占用数据库资源。  事务的只读属性
  如果一个事务只是对数据库执行读操作,那么该数据库就可以利用事务的只读属性,采取优化措施,适用于多条数据库查询操作中。
  为什么一个查询操作还要启用事务支持呢?
  这是因为 MySql(innodb)默认对每一个连接都启用了 autocommit 模式,在该模式下,每一个发送到 MySql 服务器的 SQL 语句都会在一个单独的事务中进行处理,执行结束后会自动提交事务。
  那如果我们给方法加上了 @Transactional 注解,那这个方法中所有的 SQL 都会放在一个事务里。否则,每条 SQL 都会单独开启一个事务,中间被其他事务修改了数据,都会实时读取到。
  有些情况下,当一次执行多条查询语句时,需要保证数据一致性时,就需要启用事务支持。否则上一条 SQL 查询后,被其他用户改变了数据,那么下一个 SQL 查询可能就会出现不一致的状态。  事务的回滚策略
  默认情况下,事务只在出现运行时异常(Runtime Exception)时回滚,以及 Error,出现检查异常(checked exception,需要主动捕获处理或者向上抛出)时不回滚。
  https://tobebetterjavaer.com/exception/gailan.html
  如果你想要回滚特定的异常类型的话,可以这样设置:  @Transactional(rollbackFor= MyException.class) 关于 Spring Boot 对事务的支持
  以前,我们需要通过 XML 配置 Spring 来托管事务,有了 Spring Boot 之后,一切就变得更加简单了,只需要在业务层添加事务注解( @Transactional )就可以快速开启事务。
  也就是说,我们只需要把焦点放在  @Transactional  注解上就可以了。 @Transactional 的作用范围类上,表明类中所有 public 方法都启用事务  方法上,最常用的一种  接口上,不推荐使用  @Transactional 的常用配置参数
  虽然 @Transactional 注解源码中定义了很多属性,但大多数时候,我都是采用默认配置,当然了,如果需要自定义的话,前面也都说明过了。  @Transactional 的使用注意事项总结
  1)要在 public 方法上使用,在AbstractFallbackTransactionAttributeSource类的computeTransactionAttribute方法中有个判断,如果目标方法不是public,则TransactionAttribute返回null,即不支持事务。  protected TransactionAttribute computeTransactionAttribute(Method method, @Nullable Class<?> targetClass) {     // Don"t allow no-public methods as required.     if (allowPublicMethodsOnly() && !Modifier.isPublic(method.getModifiers())) {       return null;     }      // The method may be on an interface, but we need attributes from the target class.     // If the target class is null, the method will be unchanged.     Method specificMethod = AopUtils.getMostSpecificMethod(method, targetClass);      // First try is the method in the target class.     TransactionAttribute txAttr = findTransactionAttribute(specificMethod);     if (txAttr != null) {       return txAttr;     }      // Second try is the transaction attribute on the target class.     txAttr = findTransactionAttribute(specificMethod.getDeclaringClass());     if (txAttr != null && ClassUtils.isUserLevelMethod(method)) {       return txAttr;     }      if (specificMethod != method) {       // Fallback is to look at the original method.       txAttr = findTransactionAttribute(method);       if (txAttr != null) {         return txAttr;       }       // Last fallback is the class of the original method.       txAttr = findTransactionAttribute(method.getDeclaringClass());       if (txAttr != null && ClassUtils.isUserLevelMethod(method)) {         return txAttr;       }     }     return null;   }
  2)避免同一个类中调用 @Transactional 注解的方法,这样会导致事务失效。
  更多事务失效的场景   测试事务是否起效
  在测试之前,我们先把 Spring Boot 默认的日志级别 info 调整为 debug,在 application.yml 文件中 修改:  logging:   level:     org:       hibernate: debug       springframework:         web: debug
  然后,来看修改之前查到的数据:
  开搞。在控制器中添加一个 update 接口,准备修改数据,打算把沉默王二的狗腿子修改为沉默王二的狗腿:  @RequestMapping("/update") public String update(Model model) {     User user = userService.findById(2);     user.setName("沉默王二的狗腿");     userService.update(user);     return "update"; }
  在 Service 中为方法加上  @Transactional  注解并抛出运行时异常: @Override @Transactional public void update(User user) {     userRepository.save(user);     throw new RuntimeException("啊,出现妖怪了!"); }
  按照我们的预期,当执行 save 保存数据后,因为出现了异常,所以事务要回滚。所以数据不会被修改。
  在浏览器中输入  http://localhost:8080/user/update  进行测试,注意查看日志,可以确认事务起效了。
  当我们把事务去掉,同样抛出异常:  @Override public void update(User user) {     userRepository.save(user);     throw new RuntimeException("啊,出现妖怪了!"); }
  再次执行,发现虽然程序报错了,但数据却被更新了。
  这也间接地证明,我们的  @Transactional  事务起效了。
  看到这,是不是就明白为什么新同事的优化纯属画蛇添足/卵用了吧?
  原文链接:https://mp.weixin.qq.com/s/i_Gwrb8T7L78eHOJij6n8w

羊毛不可乱薅当下,很多互联网平台会用优惠券消费津贴等方式吸引顾客消费。薅羊毛,本是指消费者通过参加商家提供的各种福利活动,使自己购买到优惠价格的商品,以达到省钱的目的。但是,有些羊毛不仅不能薅一季度新疆快递业收入逾10亿元乌鲁木齐晚报全媒体讯(记者王艳红)今年一季度,在做好常态化疫情防控的前提下,全疆快递服务企业业务量累计完成4497。40万件,同比增长46。08业务收入累计完成10。10亿元,同比麻省理工学院研究揭示了扭开奥利奥饼干背后的科学据CNET报道,奥利奥饼干中的奶油馅被归类为糊状,当你把一块饼干扭开时,很难让它粘在两面。麻省理工学院研究员CrystalOwens在一份声明中说我认为,如果你完美地扭开奥利奥饼干种植牙大揭秘种植牙机器人的那点秘密,我都告诉你昨天发布种植牙机器人的文章后,后台收到不少私信,看到大家对种植牙机器人是跃跃欲试的同时又充满疑问,今天我就告诉大家一些一般牙医不愿意告诉你的有关种植牙机器人的秘密,让大家对种植牙机蓝牙技术2028年宠物科技市场将达到200亿美元,蓝牙起到重要作用根据GlobalMarketInsightsInc的一项研究报告,到2028年,宠物科技市场预计将超过200亿美元。宠物技术市场受到对用于识别和跟踪其活动和位置的宠物安全设备的需求安信证券4月快递物流行业持续复苏行业拐点已现智通财经APP获悉,安信证券发布研报称,3月快递行业受疫情影响严重,4月快递物流行业持续复苏,物流保供政策持续发力,安信总体认为最坏冲击已过,行业拐点已现。A股重点推荐圆通速递(6谷歌突然向俄罗斯出手,公开战略地图信息,幸好我们早有准备谷歌向俄罗斯出手最近几年来,无人驾驶汽车成为了非常有争议的话题,其中特斯拉早已将无人驾驶技术投入生产使用,并取得了不错的效果与此同时谷歌研发的无人驾驶汽车,也取得了阶段性成果,通过奇瑞大蚂蚁,一款人性化的纯电新能源中型SUV!科技越是进化,就越接近生命的形态。无论是车企还是科技公司,都希望在未来赋能汽车,让人与汽车成为共生的伙伴,而不是仅仅把车看成冰冷的机器与人的从属品。不过这是一个相当长远的梦想,短期以太坊技术线图可能会使以太坊在三周内下跌20后跌至2000美元分析师仍预计以太坊将保持其长期看涨偏见,押注其备受期待的今年技术升级将获得成功。以太坊的原生代币Ether(ETH)在过去三周下跌了近20,在4月19日触及近2900美元的月度低点路由器的安装方法简单吗?第一步连接路由器1宽带是电话线接入时请准备2根较短的网线,路由器的WAN口用网线连接宽带猫(ADSLModem)。电脑用网线连接到路由器1234接口中任意一个,连接方式如下图所示宽区块链技术应用于学分银行建设的思考4三努力寻求区块链技术与学分银行建设的结合点前面已经讲到,凡需要全局性历史性地记录数据的场景都可以使用区块链技术。因此,像学分积累学分银行建设这类历史性记录数据和全局性展示场景的需求
在华为工作是什么体验?工作十年了,简单说一下吧。1少数人不签奋斗者协议,这种可以不加班,公司照样最低发年薪二十万以上。28年重签合同是最开心的,一次性按国家规定补偿,很大一笔钱到手。3没有裙带关系,全凭特斯拉副总裁陶琳消除数字鸿沟,智能汽车越白痴越好01hr周鸿祎推动智能网联汽车安全,哪吒汽车将是试验田在2021世界智能网联汽车大会上,360集团创始人董事长周鸿祎对于软件和汽车的关系进行了阐述,他认为,软件定义汽车不是数字化技曝光!拜登政府掏19亿美元,让他们拆华为中兴设备偏执!港媒美国政府掏19亿美元,让农村电信运营商拆除华为中兴设备香港南华早报28日消息,美国联邦通信委员会(FCC)27日向该国农村电信运营商发文,指导后者申请联邦政府拨款19亿美下一个华为?美国强迫台积电交出机密数据,逆转半导体议价劣势世界晶片供应受到疫情等因素,持续面临供应链可能断链的危机,为了解决这个问题,美国传出可能使用极端手段,强迫包括台积电内的晶圆代工业者,交出晶片库存订单销售纪录等企业机密数据。根据韩不想多花钱?这4款手机,预算2000元以内,也能大胆放心闭眼买说的智能手机换新这件事,预算充足的朋友基本没有什么顾虑的,甭管是苹果旗下iPhone13系列还是安卓市场的小米旗舰等等,都可以随便买。不过对于那些预算有限的朋友来说,他们更愿意选择一觉醒来,行业没了!比特币遭多国监管围剿,阿里巴巴国际站禁售虚拟货币矿机类产品华夏时报(www。chinatimes。net。cn)记者赵奕胡金华上海报道9月27日晚,阿里巴巴国际站官方发布关于禁售虚拟货币矿机类产品的公告。公告表示,根据相关法律法规的规定,三星GalaxyZFlip3耐用性测试JerryRigEverything打出好评近年来,手机制造商一直在努力提升折叠屏设备的耐用性。而近日,油管知名毁机频道JerryRigEverything又选择了对三星GalaxyZFlip3翻盖式折叠屏智能机下手。除了更iOS微信发布8。0。14正式版,加入多个新功能近期,iOS微信发布了8。0。14正式版,根据文件显示,这次的更新仅加入了关怀模式。虽然它没有提到其他新功能,但我们还是发现了其他的一些变化。首先在微信的设置中加入了关怀模式,打开哪吒推出首款数字汽车,最大续航可达1100km!近日,在互联网之光博览会上哪吒汽车官方正式公布了旗下全新纯电动轿车哪吒S,并透露了部分关于新车配置的信息。同时,根据先前信息来看,哪吒S预计将在2022年年底正式上市。外观设计上,顺丰正式入主嘉里物流,字节跳动进军汽车云,阿里APP接入微信支付顺丰正式入主嘉里物流,收获第三家上市公司9月28日晚间,顺丰控股发布公告称,截至9月28日,顺丰拟部分要约收购嘉里物流51。8股权交易已完成交割,其全资子公司FlourishHar钛晨报快手组织架构调整,将加强事业部闭环马斯克身价突破2000亿美元再登世界首富两名带货主播涉嫌偷逃税被立案检查图片来源视觉中国钛媒体综合9月28日,快手宣布架构调整。主站产品运营电商商业化等在内的多个核心业务单元,经过此轮架构调整基本实现业务闭环。包括研发数据分析PMO业务等在内的中台职能