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

拿下Spring事务

  什么是事务
  事务是数据库操作的最基本单元,是逻辑上的一组操作,要么都成功,要么都失败。是一个不可分割的工作单元。  事务的使用
  事务具有 4 个特性:原子性、一致性、隔离性】持久性,简称为 ACID 特性。  原子性(Atomicity):一个事务是一个不可分割的工作单位,一个事务中包括的操作要么都成功要么都失败。  一致性(Consistency):事务必须保证数据库从一个一致性状态变到另一个一致性状态。比如转账的总金额,不能转着转着总金额少了或者多了。大部分一致性的需求需要程序员写业务代码保证。  隔离性(Isolation):一个事务的执行不能被其它事务干扰,即一个事务内部的操作及使用的数据对并发的其它事务是隔离的,并发执行的各个事务之间不能互相打扰。  持久性(Durability):持久性也称为永久性,指一个事务一旦提交,它对数据库中数据的改变就是永久性的,后面的其它操作和故障都不应该对其有任何影响。  为什么要用事务
  举例:银行转账。小明给小红转 100 元。小明需要减少余额 100,小红需要增加余额 100。这是两个操作,需要一起成功。如果在小明转账成功之后发生了异常,就会出现小明 减 100 余额,但是小红并没有加 100 余额。就会造成钱丢失的情况。这是绝对不允许的。伪代码如下:  public void accountMoney() {     int money = 100;     //小明 少 100     userDao.reduceMoney(money);     // 其他业务 发生异常     int i = 1/0;     //小红 多 100     userDao.addMoney(money); } 复制代码事务管理方式
  Spring 支持 2 种事务管理方式。  编程式事务管理 编程式事务管理是通过编写代码实现的事务管理。可以根据需求规定事务从哪里开始,到哪里结束,拥有很高的灵活性。但是这种方式,会使业务代码与事务规则高度耦合,难以维护,因此我们很少使用这种方式对事务进行管理。所以,本文给大家介绍的是如何使用声明式事务管理。  声明式 声明式事务管理可以通过 2 种方式实现,分别是 XML和注解方式。Spring 在进行声明式事务管理时,底层使用了 AOP 。  事务管理器
  Spring 并不会直接管理事务,而是通过事务管理器对事务进行管理的。  PlatformTransactionManager
  Spring 提供了一个 PlatformTransactionManager 接口,这个接口被称为 Spring 的事务管理器,其源码如下:  public interface PlatformTransactionManager { // 根据传入的 TransactionDefinition 对象获取一个事务状态对象    TransactionStatus getTransaction(@Nullable TransactionDefinition var1) throws TransactionException;  // 提交事务    void commit(TransactionStatus var1) throws TransactionException; // 回滚事务    void rollback(TransactionStatus var1) throws TransactionException; } 复制代码
  该接口的源码很简单。这个接口针对不同的框架提供了不同的实现类,如下:
  实现类
  说明
  org.springframework.jdbc.datasource.DataSourceTransactionManager
  提供给 Spring JDBC 、MBatis 的事务管理器
  org.springframework.orm.hibernate5.HibernateTransactionManager
  提供给 Hibernate 的事务管理器
  org.springframework.orm.jpa.JpaTransactionManager
  提供给 JPA 的事务管理器
  org.springframework.jdo.JdoTransactionManager
  提供给 Jdo 的事务管理器
  org.springframework.transaction.jta.JtaTransactionManager
  提供给 JTA 的事务管理器
  注意:这些实现类,需要导入对应的依赖才能看到。该接口中还有两个对象,分别是 TransactionDefinition 和 TransactionStatus。  TransactionDefinitionTransactionDefinition:事务定义,定义了事务的名称,传播属性,事务隔离级别,是否只读,超时时间。  public interface TransactionDefinition {      int PROPAGATION_REQUIRED = 0;     int PROPAGATION_SUPPORTS = 1;     int PROPAGATION_MANDATORY = 2;     int PROPAGATION_REQUIRES_NEW = 3;     int PROPAGATION_NOT_SUPPORTED = 4;     int PROPAGATION_NEVER = 5;     int PROPAGATION_NESTED = 6;          int ISOLATION_DEFAULT = -1;     int ISOLATION_READ_UNCOMMITTED = 1;     int ISOLATION_READ_COMMITTED = 2;     int ISOLATION_REPEATABLE_READ = 4;     int ISOLATION_SERIALIZABLE = 8;          int TIMEOUT_DEFAULT = -1;      default int getPropagationBehavior() {         return 0;     }      default int getIsolationLevel() {         return -1;     }      default int getTimeout() {         return -1;     }      default boolean isReadOnly() {         return false;     }      @Nullable     default String getName() {         return null;     }      static TransactionDefinition withDefaults() {         return StaticTransactionDefinition.INSTANCE;     } } 复制代码PROPAGATION_** 0 ~ 7 代表的是事务传播行为  ISOLATION_** -1 ~ 8 代表的是事务的隔离级别  TIMEOUT_DEFAULT 默认的超时时间,-1,代表使用数据库的超时时间  getPropagationBehavior:获取事务的传播行为,默认为   PROPAGATION_REQUIRED  getIsolationLevel:获取事务的隔离级别,默认为所使用数据库的隔离级别  getTimeout:获取事务的超时时间  isReadOnly:事务是否只读  getName:获取事务的名称  TransactionStatusTransactionStatus:事务状态,保存了事务执行过程中的状态。  public interface TransactionStatus extends TransactionExecution, SavepointManager, Flushable {  	 	boolean hasSavepoint();  	 	@Override 	void flush();  } 复制代码
  方法说明如下:
  名称
  说明
  hasSavepoint
  事务内部是否带有保存点
  flush
  刷新事务  TransactionExecution  public interface TransactionExecution {     boolean isNewTransaction();     void setRollbackOnly();     boolean isRollbackOnly();        boolean isCompleted();  } 复制代码
  方法说明如下:
  名称
  说明
  isNewTransaction
  当前事务是否是新的
  setRollbackOnly
  设置事务回滚
  isRollbackOnly
  事务是否已被标记为回滚
  isCompleted
  事务是否完成,即是否已经提交或回滚  SavepointManager  public interface SavepointManager {  	Object createSavepoint() throws TransactionException; 	 	void rollbackToSavepoint(Object savepoint) throws TransactionException;  	void releaseSavepoint(Object savepoint) throws TransactionException;  } 复制代码
  方法说明如下:
  名称
  说明
  createSavepoint
  创建保存点
  rollbackToSavepoint
  回滚到给定的保存点
  releaseSavepoint
  释放给定的保存点
  有一个默认的抽象实现   AbstractTransactionStatus   ,对 TransactionExecution、savepoint、SavepointManager 有具体的实现逻辑,代码有点多,就不贴了,但是非常好理解。 对 TransactionExecution、savepoint、SavepointManager 有具体的实现逻辑,代码有点多,就不贴了,但是非常好理解。 DefaultTransactionStatus 又继承了 AbstractTransactionStatus,继续进行扩充。 public class DefaultTransactionStatus extends AbstractTransactionStatus {      // 具体事务对象 	@Nullable 	private final Object transaction; 	 	//是否是新开启的事务(=true时才会提交事务) 	private final boolean newTransaction;  // 是否是新建的同步器(=true时才会执行回调事件) 	private final boolean newSynchronization;  // 是否只读 	private final boolean readOnly; // 是否已调试 	private final boolean debug;  // 挂起的资源信息(事务传播行为要求挂起当前事务时,挂起的事务暂存信息,执行完后用于恢复) 	@Nullable 	private final Object suspendedResources; 	 	//省略… } 复制代码事务传播行为
  事务传播行为指的是,多事务方法之间进行调用时,这个过程中事务应该如何进行管理。例如,事务方法 A 在调用事务方法 B 时,B 方法是在调用者 A 方法的事务中运行呢,还是为自己开启一个新事务运行,这就是由事务方法 B 的事务传播行为决定的。
  事务方法:能让数据库表数据发生改变的方法,例如新增、删除、修改数据的方法。  public enum Propagation {     REQUIRED(0),     SUPPORTS(1),     MANDATORY(2),     REQUIRES_NEW(3),     NOT_SUPPORTED(4),     NEVER(5),     NESTED(6); } 复制代码
  行为
  说明
  REQUIRED
  如果有事务在运行,当前的方法就在这个事务内运行,否则,就启动一个新的事务,并在自己的事务内运行
  SUPPORTS
  如果有事务在运行,当前的方法就在这个事务内运行;如果当前没有事务,则以非事务的方式运行。
  MANDATORY
  如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。
  REQUIRES_NEW
  当前的方法必须启动新事务,并在它自己的事务内运行,如果有事务正在运行,应该将它挂起
  NOT_SUPPORTED
  以非事务方式运行,如果当前存在事务,则把当前事务挂起。
  NEVER
  以非事务方式运行,如果当前存在事务,则抛出异常。
  NESTED
  如果当前存在事务,则创建一个新事务作为当前事务的嵌套事务来运行;如果当前没有事务,则该取值等价于 REQUIRED。
  根据上面的描述,我们可以将行为分为三大类。  不要事务:NEVER、NOT_SUPPORTED。  如果有则用:SUPPORTS  必须使用事务:REQUIRED、REQUIRES_NEW、NESTED、MANDATORY  隔离级别
  事务有一个特性为隔离性,多事务操作之间不会产生影响。但如果不考虑隔离性,则会产生三个读问题:脏读、不可重复读、虚(幻)读。  脏读:一个未提交事务读取到另一个未提交事务的数据  不可重复读:一个未提交事务读取到另一个提交事务修改的数据  虚(幻)读:一个未提交事务读取到另一提交事务添加的数据 那如何解决呢?可以通过设置事务隔离级别,解决读问题!Spring 中提供了以下隔离级别。  级别说明  DEFAULT使用所用的数据库的隔离级别READ_UNCOMMITTED(读未提交)可以读取到尚未提交的更改,可能导致脏读、幻读和不可重复读READ_COMMITTED(读已提交)Oracle 的默认级别,可以读取到已提交的更改的数据,防止脏读,可能出现幻读和不可重复读REPEATABLE_READ(可重复读)MySQL 的默认级别,同一条SQL多次执行,可以读取到已提交的新增的数据,防止脏读和不可重复读,可能出现幻读SERIALIZABLE可串行化,什么读问题都不会产生  加入依赖     org.springframework     spring-context     5.0.8.RELEASE        org.springframework     spring-tx     5.0.8.RELEASE        org.aspectj     aspectjrt     1.9.6        org.aspectj     aspectjweaver     1.9.6  复制代码xml方式
  我们先来看看不使用事务会发生什么情况。创建名为   aopxml   的包。 提供数据库脚本CREATE TABLE `tx_test` (   `id` int(11) NOT NULL,   `name` varchar(64) DEFAULT NULL,   `money` decimal(10,0) DEFAULT NULL,   PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;   INSERT INTO `test`.`tx_test`(`id`, `name`, `money`) VALUES (1, "张三", 1000); INSERT INTO `test`.`tx_test`(`id`, `name`, `money`) VALUES (2, "李四", 1000); 复制代码开发代码新建 dao 包
  在类中提供两个方法,一个张三增加金额,一个李四减金额。  @Repository public class TXDao {      @Autowired     private JdbcTemplate jdbcTemplate;      /**      * 给张三增加金额      */     public void add(){         String sql = "update `tx_test`  set money = money + 100 where id = 1;";         jdbcTemplate.update(sql);     }      /**      * 给李四减金额      */     public void reduce(){         String sql = "update `tx_test`  set money = money - 100 where id = 2;";         jdbcTemplate.update(sql);     } } 复制代码新建 entitypublic class TxTest {      private Integer id;      private String name;      private BigDecimal money;      public Integer getId() {         return id;     }      public void setId(Integer id) {         this.id = id;     }      public String getName() {         return name;     }      public void setName(String name) {         this.name = name;     }      public BigDecimal getMoney() {         return money;     }      public void setMoney(BigDecimal money) {         this.money = money;     } } 复制代码新建 service 包@Service public class TXServiceImpl {      @Autowired     private TXDao tx;      public void transfer(){         tx.add();         int i = 1/0;         tx.reduce();     } } 复制代码
  项目结构如下:
  测试public static void main(String[] args) {     ApplicationContext context = new ClassPathXmlApplicationContext("tx.xml");     TXServiceImpl bean = context.getBean(TXServiceImpl.class);     bean.transfer(); } 复制代码
  控制台出现异常  Exception in thread "main" java.lang.ArithmeticException: / by zero 	at cn.cxyxj.txannon.service.TestServiceImpl.transfer(TestServiceImpl.java:20) 	at cn.cxyxj.txannon.AppMain.main(AppMain.java:20) 复制代码
  再来查看数据库数据,可以发现张三的金额增加了,但是李四的金额没有减。银行哭死!!! 所以我们需要引入 Spring 事务,解决上述出现的问题。  引入 tx 命名空间<?xml version="1.0" encoding="UTF-8"?>     复制代码
  注意:上面说过 Spring 提供的声明式事务管理是依赖于 Spring AOP 实现的,因此还需要添加 aop 命名空间配置。当然我还额外引入了 spring-context 命名空间。  配置事务管理器以及 JdbcTemplate                                                                                                                                                                  复制代码
  配置的事务管理器实现为 DataSourceTransactionManager,是 JDBC 和 MBatis 的PlatformTransactionManager 接口实现。  jdbc.propertiesjdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://192.168.50.172/tx_test?useSSL=false jdbc.username=Yj19980402 jdbc.password=root 复制代码配置事务通知
  配置事务通知,指定所需要使用的事务管理器以及指定事务作用的方法和该事务属性。                                                                               复制代码
  transaction-manage   参数的默认值就是 transactionManager,如果事务管理器 id 与其一致,则可以不用指定。     元素包含多个属性参数,可以为某个或某些方法(name 属性指定的方法)定义事务属性,如下表所示:
  事务属性
  说明
  propagation
  指定事务的传播行为,默认为 REQUIRED
  isolation
  指定事务的隔离级别,默认为所使用数据库的隔离级别
  read-only
  指定是否为只读事务,默认为 false
  timeout
  表示超时时间,单位为"秒"。事务在指定的超时时间后,自动回滚。避免事务长时间不提交导致数据库资源占用。默认为 -1,代表不超时
  rollback-for
  指定出现哪些异常进行事务回滚
  no-rollback-for
  指定出现哪些异常不进行事务回滚  配置切入点和切面                      复制代码
  如上写法就对 transfer 方法进行了事务管理。就不会出现小明减少余额,而小红没有增加余额的情况,发生了异常就进行回滚。  注解方式
  使用注解方式就不会有上面如此琐碎的配置了。再重新创建名为   txannon   包,将 xml 方式使用到的 entity、dao、service 相关代码 copy 过来。 开启事务
  使用   EnableTransactionManagement   注解开启事务。 @ComponentScan(basePackages = "com.cxyxj.txannon") @EnableTransactionManagement //开启事务 public class AppMain {  } 复制代码
  相当于tx:annotation-driven 标签。  创建配置类@Configuration @PropertySource("jdbc.properties") public class TxConfig {      @Value("${jdbc.url}")     private String url;      @Value("${jdbc.username}")     private String username;      @Value("${jdbc.password}")     private String password;      @Value("${jdbc.driver}")     private String driverClassName;      //创建数据库连接池     @Bean     public DriverManagerDataSource getDruidDataSource() {         DriverManagerDataSource dataSource = new DriverManagerDataSource();         dataSource.setDriverClassName(driverClassName);         dataSource.setUrl(url);         dataSource.setUsername(username);         dataSource.setPassword(password);         return dataSource;     }      //创建 JdbcTemplate 对象     @Bean     public JdbcTemplate getJdbcTemplate(DataSource dataSource) {         //到 ioc 容器中根据类型找到 dataSource         JdbcTemplate jdbcTemplate = new JdbcTemplate();         //注入 dataSource         jdbcTemplate.setDataSource(dataSource);         return jdbcTemplate;     }          //创建事务管理器     @Bean     public DataSourceTransactionManager     getDataSourceTransactionManager(DataSource dataSource) {         DataSourceTransactionManager transactionManager = new                 DataSourceTransactionManager();         transactionManager.setDataSource(dataSource);         return transactionManager;     }  } 复制代码
  可以不需要在配置切入点和切面了。  添加事务注解
  在需要添加事务的方法上添加   @Transactional   注解,表明该方法需要进行事务管理。 @Service public class TXServiceImpl {      @Autowired     private TXDao tx;      @Transactional     public void transfer(){         tx.add();         int i = 1/0;         tx.reduce();     } } 复制代码
  @Transactional   这个注解可以添加到类上面,也可以添加方法上面。如果把这个注解添加到类上面,这个类里面所有的方法都添加事务,如果把这个注解添加方法上面,则是为这个方法添加事务。 @Transactional
  Transactional   这个注解里面可以配置很多事务相关参数。 public @interface Transactional {      @AliasFor("transactionManager")     String value() default "";      @AliasFor("value")     String transactionManager() default "";      Propagation propagation() default Propagation.REQUIRED;      Isolation isolation() default Isolation.DEFAULT;      int timeout() default -1;      boolean readOnly() default false;      Class<? extends Throwable>[] rollbackFor() default {};      String[] rollbackForClassName() default {};      Class<? extends Throwable>[] noRollbackFor() default {};      String[] noRollbackForClassName() default {}; } 复制代码
  事务属性
  说明
  value
  指定不同的事务管理器。
  transactionManager
  跟 value 一致。
  propagation
  指定事务的传播行为,默认为 REQUIRED
  isolation
  指定事务的隔离级别,默认为所使用数据库的隔离级别
  read-only
  指定是否为只读事务,默认为 false
  timeout
  表示超时时间,单位为"秒"。事务在指定的超时时间后,自动回滚。避免事务长时间不提交导致数据库资源占用。默认为 -1,代表不超时
  rollbackFor
  指定出现哪些异常进行事务回滚
  rollbackForClassName
  指定异常类名称,进行事务回滚
  noRollbackFor
  指定出现哪些异常不进行事务回滚
  noRollbackForClassName
  指定出现哪些异常类名称不进行事务回滚
  基本用法会了,现在就来看看事务的传播行为,这是Spring事务中难以理解的一块,因为它的场景很多。  事务传播行为详解REQUIRED
  如果有事务在运行,当前的方法就在这个事务内运行,否则,就启动一个新的事务,并在自己的事务内运行
  如果 transfer 方法没有事务,则 reduce 方法会创建一个事务。  两个方法的事务的传播行为都为   Propagation.REQUIRED   。所以  transfer   方法会先开启一个事务,而  reduce   会加入到  transfer   方法的事务中,这两个方法用的是同一个事务,所以不论是在哪个方法中抛出异常,所有操作都会回滚。 REQUIRES_NEW
  当前方法必须启动新事务,并在它自己的事务内运行。如果有事务正在运行,应该将它挂起。
  reduce 方法行为修改为   Propagation.REQUIRES_NEW   。transfer 方法创建新事务,然后调用 reduce 方法,reduce 方法会将 transfer 方法的事务挂起,并创建属于 reduce 方法的事务。所以在该例子中会创建两个事务。由于有两个事务,那事务的回滚就出现了几种情况。 场景一transfer 方法进行的操作会回滚,reduce 方法的操作不会回滚。  场景二两个方法的操作都会回滚。这是由于 reduce 方法的异常会向 transfer 方法传递。  场景三
  transfer 方法进行的操作不会回滚,reduce 方法的操作会回滚。  如果 transfer 方法没有事务,则 reduce 方法会创建一个事务。  如果 transfer 方法有事务,则 reduce 方法会将 transfer 方法的事务挂起,并创建属于 reduce 方法的事务。如果此时 transfer 方法发生了异常,则 transfer 方法操作会回滚,但不会导致 reduce 方法回滚。如果 reduce 方法发生了异常,则 reduce 方法操作会回滚,如果 transfer 方法没有捕获 reduce 方法的异常,那 transfer 方法也会回滚。  NESTED
  如果当前存在事务(主事务),则创建一个新事务作为当前事务的嵌套事务(子事务)来运行;如果当前没有事务,则该取值等价于 REQUIRED。
  如果 transfer 方法没有事务,则 reduce 方法会创建一个事务。  如果 transfer 方法有事务,则 reduce 方法会创建一个新事务,作为 transfer 方法事务的嵌套事务来运行。那会有什么场景呢?  场景一
  transfer 方法发生异常并回滚,会导致 reduce 方法 同时回滚。  场景二
  transfer 方法进行的操作不会回滚,reduce 方法的操作会回滚。   注意   :transfer 方法需要进行 catch,不然 transfer 方法也会回滚。
  主事务方法异常回滚时,会同时回滚子事务。而子事务可以单独异常回滚,可以不影响主事务和其他子事务(前提是需要处理掉子事务的异常)  MANDATORY
  如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。
  由于 transfer 方法没有事务,在启动时就会抛出异常,如下:  No existing transaction found for transaction marked with propagation "mandatory" 复制代码SUPPORTS
  如果有事务在运行,当前的方法就在这个事务内运行;如果当前没有事务,则以非事务的方式运行。
  由于 transfer 方法没有事务,所以 reduce 方法也不会创建事务,发生了异常也不会进行回滚。  NOT_SUPPORTED
  以非事务方式运行,如果当前存在事务,则把当前事务挂起。
  transfer 方法有事务,但 reduce 方法传播行为是 NOT_SUPPORTED,所以会将 transfer 方法事务挂起,reduce 方法以非事务的方式运行。
  所以图片例子会出现 transfer 方法进行的操作会回滚,reduce 方法的操作不会回滚。  NEVER
  以非事务方式运行,如果当前存在事务,则抛出异常。
  由于 transfer 方法有事务,在启动时就会抛出异常,如下:  Existing transaction found for transaction marked with propagation "never" 复制代码回滚规则
  上面一直在说遇到异常就回滚,那是遇到所有异常都会回滚吗?不是的,默认情况下,Spring 事务只有遇到 RuntimeException 以及 Error 时才会回滚,在遇到检查型异常时是不会回滚的,比如 IOException、TimeoutException。
  那如果想在发生检查型异常时也进行回滚呢,可以使用 rollbackFor 属性进行如下配置:
  那同理,如果遇到某个异常,不想进行回滚,使用 noRollbackFor 属性配置如下:

曝光荣耀80Pro非常亮眼,荣耀60沦为白菜机捡漏新福利最近曝光的荣耀80Pro非常亮眼,优秀的一体微曲面屏幕,颜值爆表,搭配天玑9100高性能低功耗处理器,1英寸超大底主摄及计算摄影技术,综合体验将彻底提升一个档次,是一款非常优秀的全新疆自驾游,你必须要知道的事今年越来越多的人加入到自驾游和越野探险的活动中来,特别是周末和节假日带孩子老人自驾游的越来越多,在新疆自驾你得知道这些事。一如果你只去收钱的著名的常规旅游景点,不管你是开轿车还是越世界上最神秘的按摩店,服务员背景惊人,顾客被吓得腿软很多有钱人每年都会到世界上的各个地方去旅行,在他们眼里,即便是到国外旅游地。(此处已添加小程序,请到今日头条客户端查看)也不算什么新鲜的事情了,因为他们只是通过这种方式来缓解自己在刚刚,宁德时代发布重磅消息,速看每经编辑杜宇据宁德时代(SZ300750,股价511元,市值1。2万亿元)官方微博8月26日消息,宁德时代将于8月27日15301630举行麒麟电池落地车型发布会。据证券时报,6月深扒各个年代的明星造型,苏王口中的港风精髓是什么?深扒各个年代的明星造型,感觉各有各的特色和美感,尤其是80,90年代的港风造型,一直被模仿,但始终未被超越。那苏王口中的港风精髓又是什么呢?苏王对港风简单的总结就是明艳动人性感柔媚产品驱动,渠道提效,李宁稳健背后的深层经营逻辑2022年上半年,由于外界复杂多变的因素影响,稳中求进成为企业上半年发展的关键词。近日,李宁公司发布集团2022年上半年中期财报业绩。2022年上半年,得益于持续锻造肌肉型企业体质军工行业专题罗尔斯罗伊斯,百年锤炼成就全球航空发动机龙头(报告出品方作者兴业证券,石康,李博彦,董昕瑞)1罗尔斯罗伊斯公司全球航空发动机龙头,百年锤炼成就全球航空发动机龙头1。1公司概况技术创新引领行业发展,挫折中涅槃重生罗尔斯罗伊斯公陶醉夹谷台下不夜谷陶醉夹谷台下不夜谷坎坷人生应有雅,珍惜暮岁好年华。民间非是任他去,我伴诗书看晚霞。7月30日天气非常闷热,午睡两小时后,精神饱满。为了消除寂寞的感觉,开车拉着好友进山去,小游一番。通报通的是情感和温度九派时评九派新闻特约评论员赵代君情况通报是一种告知性的公文,用于告知重要情况,主要起着沟通情况的作用。通常我们看到的通报都是冷静的格式化的。但是,今天(25日)看到的一篇简短的通告,让我们和秦plusdmi美好的一下午!南山根公园一日游!眼瞅着夏季快过去了,不去一次南山根公园可惜了。有了小秦,开近点的地方用电就可以行驶了,也不担心油耗!我们很快到达目的地,门口是大大的喷泉。警官特别好看,有山有水,为什么国产单机剧情尴尬?为什么国产单机剧情尴尬?去年到今年。我们看到了很多虚幻4开发的作品,比如神武幻想潜龙传等。这足以证明中国虽然存在技术差距,但并不是不可逾越的门槛。但是纵观这些作品,很多玩家都提到了正面硬刚iPhone14!华为Mate50定档9月,三大亮点引人关注沉浸了许久的华为Mate50系列,终于要正式回归了,Mate系列不在的这些日子里,国产高端旗舰全面开花,小米OPPO在内的一众厂商都向高端旗舰进军,新鲜科技和自研技术齐上阵,但大多北京市农林科学院畜牧兽医研究所在揭示塞内卡病毒复制的分子机制上取得新进展近期,北京市农林科学院畜牧兽医研究所畜禽生物制剂高技术研究室在塞内卡病毒与宿主蛋白相互作用诱导细胞自噬开展了一系列研究工作,主要成果相继发表在国际学术期刊FrontiersinMi三国杀最强精品武将出现!一个技能当四个技能用,业界良心三国杀最强精品武将出现!一个技能当四个技能用,业界良心!(榴莲爱游戏)去经历,去遇见!今天又是元气满满的一天哦,去追逐你热爱的星海吧!大家好呀我是榴莲,欢迎浏览本期的榴莲说三国!最游玩途中看电影!房山朝阳海淀这4条线路游玩指南请收藏原标题漫步北京美好享受电影之旅主题游线路(三)电影就是生活,每一部电影谱写不同的生命乐章旅行也是生活,每一段旅程书写不同的生命片段。一部电影往往能让人记住一个地方,一座城市。故事情5G移动电话用户达4。75亿户数据来源工信部中国信息通信研究院制图蔡华伟核心阅读我国5G商用牌照正式发放3年来,基站规模屡创新高,关键技术创新突破取得新进展,用户用网体验明显改善。如今,我国已建成全球规模最大的篮网首份被拒绝合同出炉,威少被看好,锡伯杜将重用163后卫北京时间8月22日,NBA自由市场正在进行,其中雷蒙德费尔顿表示,我喜欢布伦森的心态,那里需要他的强硬,托平的上场时间不会增加,雷迪什还要排在他之后。就在刚刚,联盟迎来多个消息,与香蒲,湿地公园造景植物之一在很多自然风景区的湿地公园和自然山水林园的水边,香蒲是一种造景的水生植物,它是一种多年生水生或沼生草本植物,它长啥样子可以参考下面图片。在湿地公园中它起到生态功能保护的作用,可以净吓瘫游客!黄石公园温泉惊现尸体,还有更离谱的死法近日,风景秀丽的黄石国家公园,出现惊悚一幕一只残缺的脚掌漂浮在公园内的深渊池本周,黄石公园的一名员工在公园南部的深渊池(AbyssPool),发现了这只残缺的脚掌。该公园公共事务官处暑将至,无论贫富,建议多吃5种碱性食物,解秋乏,秋天少犯困人不管走到哪一步,总得找点乐子,想一点办法。是的,美食就是我找的乐子,想的办法!小谈食刻和你一起认真对待吃下的食物!导读8月23日,将会迎来大家非常喜欢的处暑节气,为啥说处暑是大家广州城再咬咬牙!客战北京国安后,月底将迎大腿吉列尔梅南都讯记者陶新蕾北京时间8月22日晚7时30分,中超第14轮,广州城将客场对阵北京国安。广州城在倒计时外援吉列尔梅归队登场的日子。巴西人已回到广州进行居家健康监测。在他之前,8月1九安背翰林祠,主人为北宋画家,苏东坡专门为其画赋诗并流传千古一直在路上,发现美,分享快乐!去往九嶷山舜帝陵的冷九公路,古时就是祭拜舜帝的官道,路途中有一座驿站,慢慢发展为一个村子,这就是路亭。路亭村有一座云龙牌坊,气势非凡,很多经过此地前往
新商业渡劫,能更好满足消费者需求的企业会活得更好9月78日,2022DEMOCHINA创新中国峰会在江苏省无锡市举行。本次峰会以转折点为主题,邀请政府领导产业专家知名投资人以演讲专场对话等形式带来最新的行业洞察,来自全国的优秀创欧国联塞尔维亚VS瑞典,米特罗维奇是否能拿下胜利?塞尔维亚塞尔维亚世界排名第二十五,球队的身价为3。34亿欧元,队内也有许多实力悍将,锋线上有效力于皇马的约维奇阿贾克斯的塔迪奇,当然最为核心的射手还是效力富勒姆的米特罗维奇,他自己疏散星团结构研究获进展近日,中国科学院上海天文台在疏散星团结构研究中取得重要进展,揭示了疏散星团具有致密核心及延展外晕的双成分结构特征,扩展了疏散星团的空间范围。这一成果开创了疏散星团研究的全新视角,刷NASA朱诺号探测器将为最接近木卫二的飞越做准备美国宇航局(NASA)的朱诺号探测器即将与木星的卫星木卫二(欧罗巴,Europa)亲密接触。它正在为几十年来最接近该卫星的飞越做准备。周四,NASA了该探测器在定于9月29日星期四全球气候变化影响宇宙观测灵敏度和准确度2020年,发表在NatureAstronomy的一篇论文中表示,全球变暖和大气水位上涨已经影响到重要科学天文台(例如包括欧洲南方天文台的VeryLargeTelescope)的灵Aleksei等JGR锆石捕虏晶的次生斜锆石边记录了金伯利岩就位时间金伯利岩是目前地球上已知来源最深的岩浆产物,其就位时常捕获大陆岩石圈地幔的样品。金伯利岩年龄分布广,这使得它成为揭示地幔形成和演化历史的重要载体。然而,金伯利岩常缺乏适宜的定年矿物如何看待追觅新出的年度卷王扫地机X10系列?家里有小孩或者小宠物的,是不是都有一着共同的感受地面上随时都会有各种小垃圾的出现,自己一会儿要去扫,一会儿要去清理的,特别麻烦。所以像这种情况的话建议配备一个勤快的助手哦,追觅10最新PS20229月最新23。5。1横空出世插件合集最新PS202223。5。1横空出世。今天主编就给大家介绍一番!在国庆节来临之际小夕给大家带来一期最新的PS插件合集,全新的主题界面,可选择性的勾选安装,可以根据自己需求安装(用哪云米AI冰箱SmartE(对开门535L),食材放心囤,除菌新科技近来几天,全国各地的疫情又略有波动,静默管理的新闻几乎每天都可以看到。一个女生疯狂入手11台冰箱用来存储食材的新闻也是上了热搜。经历过今年3月份封闭管理的日子,我们家深知任正非最近曾经全球手机的王者,诺基亚,如今东莞工厂人去楼空,面目全非提到诺基亚,大家会想到什么?是标志性的牵手动画,还是顶呱呱的产品质量?不错,诺基亚可谓是手机界的一个传奇。作为曾经全球手机的王者,诺基亚曾经在东莞拥有一座全球最大的手机工厂。这座建大疆Action3发布,前后双屏回归,长续航保障拍摄运动相机对于一些喜欢运动或者是喜欢拍Vlog的小伙伴来说,是一个非常不错的选择。它和手机不一样,它的体积更小而且可以装备在衣领或者是户外骑车的头盔上,在不同的视角拍摄视频,能够记录