焦点热讯:Spring事务管理报错Transaction rolled back because it has been marked as rollback-only

2023-02-15 02:20:51 来源: 腾讯云

事务是我们平时项目中对数据操作最为直接、常用的方式,现在无论是大小公司都离不开对事务的操作,伴随业务的提升,客户量的积累也大大增加了对事务管理的难度。


【资料图】

在本章节中将会讲到如下内容:

1、线上环境对roll back only 的处理2、线上环境对嵌套事务的解决方案3、11个demo分析事务失效的场景4、分布式事务5、事务也能异步

1、线上环境对roll back only 的处理与产生

org.springframework.dao.CannotAcquireLockException: ### Error updating database.  Cause: com.mysql.cj.jdbc.exceptions.MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction### The error may involve xxxMapper.insert-Inline### The error occurred while setting parameters### SQL: INSERT INTO xxx### Cause: com.mysql.cj.jdbc.exceptions.MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction; Lock wait timeout exceeded; try restarting transaction; nested exception is com.mysql.cj.jdbc.exceptions.MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction

产生原因:

事务嵌套,内层事务将异常捕获未抛出。

2、线上环境对嵌套事务的解决方案

优化点可以从以下几点进行考虑:

最为直接的方法便是去掉嵌套事务,在controller层统一决定异常处理

对于类似开发过程中,需考虑将相关方法长事务中查询方法剔除,将方法内事务缩短为最小事务

出现突发情况,应提供最为简单有效的方案,让业务正常操作,不受影响

开发应对当时的技术方案告知相关测试

在代码层面,后续代码需要前面操作事务释放锁

无需等待插入结果 直接插入后续数据

将查询放在事务外面尽量将大事务变为小事务

捕获异常 自动重试

但是短时间内我还没有时间进行整改,在不影响主流程的情况下未进行整改,但我后续才知道大错特错。

排查

@timestamp September 1st 2021, 10:20:24.637# @version  1t LOG_DATEFORMAT_PATTERN    yyyy-MM-dd HH:mm:ss.SSSt LOG_LEVEL_PATTERN %5pt _id   VMaGt _index    applog-2021.09.01# _score    1t _type doct appindex  applogt appname   appt host  10.0.74.157t level ERROR# level_value   40,000t logger_name   ExceptionLogCollectort message   未知异常[500] => Transaction rolled back because it has been marked as rollback-only# port  10,792t stack_trace   org.springframework.transaction.UnexpectedRollbackException: Transaction rolled back because it has been marked as rollback-onlyat org.springframework.transaction.support.AbstractPlatformTransactionManager.processRollback(AbstractPlatformTransactionManager.java:873) ~[spring-tx-5.1.4.RELEASE.jar!/:5.1.4.RELEASE]at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:710) ~[spring-tx-5.1.4.RELEASE.jar!/:5.1.4.RELEASE]at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:533) ~[spring-tx-5.1.4.RELEASE.jar!/:5.1.4.RELEASE]at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:304) ~[spring-tx-5.1.4.RELEASE.jar!/:5.1.4.RELEASE]at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:98) ~[spring-tx-5.1.4.RELEASE.jar!/:5.1.4.RELEASE]at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.1.4.RELEASE.jar!/:5.1.4.RELEASE]at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:688) ~[spring-aop-5.1.4.RELEASE.jar!/:5.1.4.RELEASE]spring-tx-5.1.4.RELEASE.jar-org.springframework.transaction.interceptor.TransactionInterceptor#事务拦截器avatar

spring事务分为声明式事务和编程式事务,若目标方法存在事务,spring会对bean生成一个代理对象,从日志来看是cglib的

入口98行springaop事务增强 TransactionAspectSupport在事务中的调用,执行代理类的目标方法触发invoke

@Nullableprotected Object invokeWithinTransaction(Method method, @Nullable Class targetClass,            final InvocationCallback invocation) throws Throwable方法为protected的,根据源代码注释解析

if (txAttr == null || !(tm instanceof CallbackPreferringPlatformTransactionManager))

如果事务属性为null 且事务类型是CallbackPreferringPlatformTransactionManager进入304行commitTransactionAfterReturning(txInfo);方法

意为事务成功后执行,有异常不执行,没有事务不执行,也就是为后面的事务方法异常时没执行进行了铺垫,533行

txInfo.getTransactionManager().commit(txInfo.getTransactionStatus());事务进行commit时进行判断

如果不是进行全局事务提交 但是是RollbackOnly的话

走processRollback处理实际回滚

@Override    public final void commit(TransactionStatus status) throws TransactionException {        if (status.isCompleted()) {            throw new IllegalTransactionStateException(                    "Transaction is already completed - do not call commit or rollback more than once per transaction");        }        DefaultTransactionStatus defStatus = (DefaultTransactionStatus) status;        if (defStatus.isLocalRollbackOnly()) {            if (defStatus.isDebug()) {                logger.debug("Transactional code has requested rollback");            }            processRollback(defStatus, false);            return;        }        if (!shouldCommitOnGlobalRollbackOnly() && defStatus.isGlobalRollbackOnly()) {            if (defStatus.isDebug()) {                logger.debug("Global transaction is marked as rollback-only but transactional code requested commit");            }            日志追踪的710行-----记住此处传true            processRollback(defStatus, true);            return;        }        processCommit(defStatus);    }private void processRollback(DefaultTransactionStatus status, boolean unexpected) {        try {            入参为true            boolean unexpectedRollback = unexpected;            try {                triggerBeforeCompletion(status);                if (status.hasSavepoint()) {                    if (status.isDebug()) {                        logger.debug("Rolling back transaction to savepoint");                    }                    status.rollbackToHeldSavepoint();                }                else if (status.isNewTransaction()) {                    if (status.isDebug()) {                        logger.debug("Initiating transaction rollback");                    }                    doRollback(status);                }                else {                    // Participating in larger transaction                    if (status.hasTransaction()) {                        if (status.isLocalRollbackOnly() || isGlobalRollbackOnParticipationFailure()) {                            if (status.isDebug()) {                                logger.debug("Participating transaction failed - marking existing transaction as rollback-only");                            }                            doSetRollbackOnly(status);                        }                        else {                            if (status.isDebug()) {                                logger.debug("Participating transaction failed - letting transaction originator decide on rollback");                            }                        }                    }                    else {                        logger.debug("Should roll back transaction but cannot - no transaction available");                    }                    // Unexpected rollback only matters here if we"re asked to fail early                    if (!isFailEarlyOnGlobalRollbackOnly()) {                        unexpectedRollback = false;                    }                }            }            catch (RuntimeException | Error ex) {                triggerAfterCompletion(status, TransactionSynchronization.STATUS_UNKNOWN);                throw ex;            }            triggerAfterCompletion(status, TransactionSynchronization.STATUS_ROLLED_BACK);            日志追踪的873行  抛出异常            // Raise UnexpectedRollbackException if we had a global rollback-only marker            if (unexpectedRollback) {                throw new UnexpectedRollbackException(                        "Transaction rolled back because it has been marked as rollback-only");            }        }        finally {            cleanupAfterCompletion(status);        }    }

事务这里场景和传播行为相关知识点太多了,这个后续接着分析

但就此场景将伪代码贴一下

try    {        methodA()    }catch    {    }    @Transactional(rollbackFor = Exception.class)    public methodA() {        methodB()    }    @Transactional(rollbackFor = Exception.class)    public methodB() {        try {            methodC()        } catch {        }    }    methodC() {        当C方法抛出异常时    }

不知道大家对于rpc行为调用的接口是如何处理的,我们以前是将rpc调用的接口有Biz接收进来,进行参数处理,领域模型转换后,调取service进行内部数据处理的,但此时的接口在主流程上会伴随着另一个第三方接口的写操作,需进行事务处理,那么内层service接口为什么还要进行事务管理?在设计上理应不对rpc接口操作的service进行开放调用的,但业务上区分不同场景,不同供应商,不同酒店等对接口进行了反射调用,或者app调用,导致内层service也进行了事务操作,那么问题来了,嵌套事务时,如果内层事务注解取消不抛出

UnexpectedRollbackException,实际此方法内并没有完全执行完,

我希望是怎样的?我希望在保持事务原子性的前提,内层事务回滚则整个全局事务回滚,且不报此异常

第一种方法isGlobalRollbackOnParticipationFailure方法,让主事务来决定是否回滚,

改动成本大

而在Springaop中,被拦截的方法需要显式的抛出异常,并不能经过任何处理,这样aop才能进行回滚,默认aop是只catchruntimeException的异常 第二种方法可以在catch块里加上 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly() 手动回滚 即便上层事务发生了异常,也想要最终提交整个事务呢?如果有这样的需求的话,可以给事务管理器配置一个参数 setGlobalRollbackOnParticipationFailure(false); # 改动成本大

解决方案:在内层方法中不进行方法的try catch,有异常操作时在外层事务进行处理,且可决定是否回滚,特定的异常也再次处理

回顾:事务的失效场景(事务不生效和事务不回滚)

3、11个demo分析事务失效的场景

@Slf4j@Servicepublic class DemoService {@Autowiredprivate Test1Mapper test1Mapper;@Autowiredprivate TestMapper testMapper;@Autowiredprivate InvalidTransactionService invalidTransactionService;@Autowiredprivate ExecutorService executorService;@Autowiredprivate DemoService _self;@Autowiredprivate ValidTransactionService validTransactionService;@Autowiredprivate RequireNewTransactionService requireNewTransactionService;/******************************************************** * 事务不生效场景1 * 相当于调用this调用,没有产生代理对象调用,解决方法,自己把自己注入以后调用 ********************************************************/public void demo1() {invalidTransaction();//TODO other logic code here}@Transactionalpublic void invalidTransaction() {TestDO test = new TestDO();test.setName("11111");testMapper.insert(test);Test1DO test1 = new Test1DO();test1.setCust("2222");test1Mapper.insert(test1);throw new WMSException(ErrorCodeEnum.BD10001001.code(),"事务不生效场景1");}/******************************************************** * 事务不生效场景二 * 这个例子的目的是为了catch住内层事务的异常,让外层事务成功,但是实际上没有内外层事务都回滚了 * * 这里A和B都受事务控制,并且是处于同一个事务的。 * A调用B,A中抓了B的异常,当B发生异常的时候,B的操作应该回滚,但是A吃了异常,A方法中没有产生异常,所以A的操作又应该提交,二者是相互矛盾的。 * spring的事务关联拦截器在抓到B的异常后就会标记rollback-only为true,当A执行完准备提交后,发现rollback-only为true,也会回滚,并抛出异常告诉调用者。 * * 报错提示:Transaction rolled back because it has been marked as rollback-only * * 如果想使外层事务生效可以把内层事务传播特性修改为:@Transactional(propagation = Propagation.REQUIRES_NEW) *  ********************************************************/@Transactionalpublic void demo2() {TestDO test = new TestDO();test.setName("3333");testMapper.insert(test);try {invalidTransactionService.transaction();}catch (Exception e) {log.error("服务异常,异常被捕获", e);}}/******************************************************** * 事务不生效场景三 * * 因为开了线程异步执行,等于事务完全在两个线程内,不在一个线程,所以即使抛错,也是一个生效一个不生效, * 事务没有回滚 *  ********************************************************/@Transactionalpublic void demo3() {TestDO test = new TestDO();test.setName("5555");testMapper.insert(test);executorService.execute(() -> {Test1DO test1 = new Test1DO();test1.setCust("6666");test1Mapper.insert(test1);});throw new WMSException(ErrorCodeEnum.BD10001001.code(),"事务不生效场景3");}/******************************************************** * 事务不生效场景八 * Spring默认情况下会对运行期例外(RunTimeException)进行事务回滚。这个例外是unchecked,如果遇到checked意外就不回滚。 * Exception包含RuntimeException体系和其他非RuntimeException的体系 * Error和RuntimeException及其子类成为未检查异常(unchecked),其它异常成为已检查异常(checked)。 * spring声明式事务管理默认对非检查型异常和运行时异常进行事务回滚,而对检查型异常则不进行回滚操作 * * *那么什么是检查型异常什么又是非检查型异常呢? * 1.继承自runtimeexception或error的是非检查型异常,而继承自exception的则是检查型异常(当然,runtimeexception本身也是exception的子类)。 * 2.对非检查型类异常可以不用捕获,而检查型异常则必须用try语句块进行处理或者把异常交给上级方法处理总之就是必须写代码处理它。所以必须在service捕获异常,然后再次抛出,这样事务方才起效。 * * @throws IOException  *  ********************************************************/@Transactionalpublic void demo8() throws IOException {TestDO test = new TestDO();test.setName("11111");testMapper.insert(test);Test1DO test1 = new Test1DO();test1.setCust("2222");test1Mapper.insert(test1);throw new IOException("事务不生效场景8");}/******************************************************** * 事务不生效场景九 * @throws IOException  *  ********************************************************/public void demo9(){invalidTransaction2();}@Transactionalprivate void invalidTransaction2() {TestDO test = new TestDO();test.setName("11111");testMapper.insert(test);Test1DO test1 = new Test1DO();test1.setCust("2222");test1Mapper.insert(test1);throw new WMSException("事务不生效场景9");}/******************************************************** * 事务生效场景1 *  ********************************************************/public void demo4() {_self.invalidTransaction();//TODO other logic code here}/******************************************************** * 事务生效场景二 * * 因为内层没有事务控制,所以内层报错,不会混回滚,同样外层catch住,所以外层业务成功 ********************************************************/@Transactionalpublic void demo5() {TestDO test = new TestDO();test.setName("7777");testMapper.insert(test);try {validTransactionService.transaction();}catch (Exception e) {log.error("服务异常,异常被捕获", e);}}/******************************************************** * 事务生效场景三 * *内层事务配置的是REQUIRES_NEW,表示自己用自己的,不和外层有牵连,内层如果报错,事务会回滚 * 外层如果catch住了,就可以正常执行,外层生效,内层回滚 ********************************************************/@Transactionalpublic void demo6() {TestDO test = new TestDO();test.setName("9999");testMapper.insert(test);try {requireNewTransactionService.transactionWithException();}catch (Exception e) {log.error("服务异常,异常被捕获", e);}}/******************************************************** * 独立事务 * 内外层事务独立,内层操作未报错,事务正常执行,外层有错,事务回滚。 ********************************************************/@Transactionalpublic void demo7() {TestDO test = new TestDO();test.setName("9999");testMapper.insert(test);requireNewTransactionService.transaction();throw new WMSException(ErrorCodeEnum.BD10001001.code(),"独立事务");}}

4、分布式事务以及分布式事务嵌套

一次业务操作需要跨多个数据源或需要垮多个系统进行远程调用,就会产生分布式事务问题

全局事务一致性问题

全局事务id+三组件 tc+tm+rm

Seata(AT 模式)的默认全局隔离级别是 读未提交(Read Uncommitted)

Seata 是 Simple Extensible Autonomous Transaction Architecture 的简写,由 feascar 改名而来。

AT模式 默认

TCC模式

XA模式

SAGA模式 长事务解决方案

XID 由ip 端口号 加全局事务id生成

关于分布式事务,工程领域主要讨论的是强一致性和最终一致性的解决方案。典型方案包括:

两阶段提交(2PC, Two-phase Commit)方案

eBay 事件队列方案

TCC 补偿模式

缓存数据最终一致性

一致性理论

分布式事务的目的是保障分库数据一致性,而跨库事务会遇到各种不可控制的问题,如个别节点永久性宕机,像单机事务一样的ACID是无法奢望的。另外,业界著名的CAP理论也告诉我们,对分布式系统,需要将数据一致性和系统可用性、分区容忍性放在天平上一起考虑。

两阶段提交协议(简称2PC)是实现分布式事务较为经典的方案,但2PC 的可扩展性很差,在分布式架构下应用代价较大,eBay 架构师Dan Pritchett 提出了BASE 理论,用于解决大规模分布式系统下的数据一致性问题。BASE 理论告诉我们:可以通过放弃系统在每个时刻的强一致性来换取系统的可扩展性。

CAP理论在分布式系统中,一致性(Consistency)、可用性(Availability)和分区容忍性(Partition Tolerance)3 个要素最多只能同时满足两个,不可兼得。

其中,分区容忍性又是不可或缺的。

avatar

一致性:分布式环境下多个节点的数据是否强一致。可用性:分布式服务能一直保证可用状态。当用户发出一个请求后,服务能在有限时间内返回结果。分区容忍性:特指对网络分区的容忍性。举例:Cassandra、Dynamo

等,默认优先选择AP,弱化C;HBase、MongoDB 等,默认优先选择CP,弱化A。

BASE理论核心思想:

基本可用(BasicallyAvailable):指分布式系统在出现故障时,允许损失部分的可用性来保证核心可用。

软状态(SoftState):指允许分布式系统存在中间状态,该中间状态不会影响到系统的整体可用性。

最终一致性(EventualConsistency):指分布式系统中的所有副本数据经过一定时间后,最终能够达到一致的状态。

一致性模型数据的一致性模型可以分成以下 3 类:强一致性:数据更新成功后,任意时刻所有副本中的数据都是一致的,一般采用同步的方式实现。 弱一致性:数据更新成功后,系统不承诺立即可以读到最新写入的值,也不承诺具体多久之后可以读到。 最终一致性:弱一致性的一种形式,数据更新成功后,系统不承诺立即可以返回最新写入的值,但是保证最终会返回上一次更新操作的值。 分布式系统数据的强一致性、弱一致性和最终一致性可以通过Quorum NRW算法分析。分布式事务解决方案2PC方案——强一致性2PC的核心原理是通过提交分阶段和记日志的方式,记录下事务提交所处的阶段状态,在组件宕机重启后,可通过日志恢复事务提交的阶段状态,并在这个状态节点重试,如Coordinator重启后,通过日志可以确定提交处于Prepare还是PrepareAll状态,若是前者,说明有节点可能没有Prepare成功,或所有节点Prepare成功但还没有下发Commit,状态恢复后给所有节点下发RollBack;若是PrepareAll状态,需要给所有节点下发Commit,数据库节点需要保证Commit幂等。avatar2PC方案的问题:同步阻塞。数据不一致。单点问题。升级的3PC方案旨在解决这些问题,主要有两个改进:增加超时机制。两阶段之间插入准备阶段。但三阶段提交也存在一些缺陷,要彻底从协议层面避免数据不一致,可以采用Paxos或者Raft算法。eBay 事件队列方案——最终一致性eBay 的架构师Dan Pritchett,曾在一篇解释BASE 原理的论文《Base:An AcidAlternative》中提到一个eBay分布式系统一致性问题的解决方案。它的核心思想是将需要分布式处理的任务通过消息或者日志的方式来异步执行,消息或日志可以存到本地文件、数据库或消息队列,再通过业务规则进行失败重试,它要求各服务的接口是幂等的。描述的场景为,有用户表user和交易表transaction,用户表存储用户信息、总销售额和总购买额,交易表存储每一笔交易的流水号、买家信息、卖家信息和交易金额。如果产生了一笔交易,需要在交易表增加记录,同时还要修改用户表的金额。avatar论文中提出的解决方法是将更新交易表记录和用户表更新消息放在一个本地事务来完成,为了避免重复消费用户表更新消息带来的问题,增加一个操作记录表updates_applied来记录已经完成的交易相关的信息。

这个方案的核心在于第二阶段的重试和幂等执行。失败后重试,这是一种补偿机制,它是能保证系统最终一致的关键流程。

TCC (Try-Confirm-Cancel)补偿模式——最终一致性

某业务模型如图,由服务 A、服务B、服务C、服务D 共同组成的一个微服务架构系统。服务A 需要依次调用服务B、服务C 和服务D

共同完成一个操作。当服务A 调用服务D 失败时,若要保证整个系统数据的一致性,就要对服务B 和服务C 的invoke

操作进行回滚,执行反向的revert 操作。回滚成功后,整个微服务系统是数据一致的。

avatar

实现关键要素:服务调用链必须被记录下来。每个服务提供者都需要提供一组业务逻辑相反的操作,互为补偿,同时回滚操作要保证幂等。必须按失败原因执行不同的回滚策略。

缓存数据最终一致性

在我们的业务系统中,缓存(Redis 或者Memcached)通常被用在数据库前面,作为数据读取的缓冲,使得I/O

操作不至于直接落在数据库上。以商品详情页为例,假如卖家修改了商品信息,并写回到数据库,但是这时候用户从商品详情页看到的信息还是从缓存中拿到的过时数据,这就出现了缓存系统和数据库系统中的数据不一致的现象。

要解决该场景下缓存和数据库数据不一致的问题我们有以下两种解决方案:为缓存数据设置过期时间。当缓存中数据过期后,业务系统会从数据库中获取数据,并将新值放入缓存。这个过期时间就是系统可以达到最终一致的容忍时间。更新数据库数据后同时清除缓存数据。数据库数据更新后,同步删除缓存中数据,使得下次对商品详情的获取直接从数据库中获取,并同步到缓存。

常用组件: Seata,Sega,Atomikos

avatar

TC (Transaction Coordinator) - 事务协调者

维护全局和分支事务的状态,驱动全局事务提交或回滚。

TM (Transaction Manager) - 事务管理器

定义全局事务的范围:开始全局事务、提交或回滚全局事务。

RM (Resource Manager) - 资源管理器

管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。

avatar

安装

关键注解全局@GlobalTranstional

1.更改事务组名称service

2.store更改mode 修改db

3.执行sql

4.修改注册进nacos

5.启动seata-server.bat

如何保证分布唯一全局id的生成

5、分布式事务异步方案

看下分布式事务的异步问题,根据事务的xid搭配future在切面里对注解进行处理,实现异步+分布式事务的并存

注意事项

这个依赖只是用来解决部分问题,不是解决全部问题

这个仅用于TM端,不要用来RM端(其实要实现RM端的话,可以仿照SeataAsyncAspect,写一个aspect,很简单的)

不要进行事务嵌套,不支持事务嵌套!!!

确保异步的多个操作之间是没有先后顺序的

这个是一个私人包装处理,仅供参考,还未应用到生产环境

—-待续

标签: Java 微服务架构

焦点热讯:Spring事务管理报错Transaction rolled back because it has been marked as rollback-only

事务是我们平时项目中对数据操作最为直接、常用的方式,现在无论是大小公司都离不开对事务的操作,伴随...

02-15 02:20:51

全球头条:橡皮用英语怎么说

用橡胶制成的文具,能擦掉石墨或墨水的痕迹,橡皮的种类繁多,你知道橡皮用英语怎么说吗?现在跟学习啦小...

02-15 01:02:43

当前速读:樱桃萝卜能生吃吗 樱桃萝卜可不可以生吃呢

1、樱桃萝卜能生吃。樱桃萝卜是小型萝卜中的一种,又称为水果萝卜,其口感清爽脆嫩,味道较甘甜,樱桃萝...

02-14 22:49:27

很走心的毕业赠言给老师80句最新

老师是人类灵魂的工程师,是培育祖国花朵的辛勤园丁,是我们成长道路上的引路人。永远感恩老师。你是否...

02-14 20:58:56

这里的外环线要“站起来”了!外环东段交通功能提升工程即将开工

最近,外环东段(华夏中路-龙东大道)交通功能提升工程正在开展前期绿化搬迁、管线搬迁及桩基试桩工作,...

02-14 20:14:58

世界头条:洛阳启动“护苗2023”春季开学季系列宣讲活动 社会与法

中新网河南新闻2月14日电(刘鹏尹松峰)“同学们,你们了解一本图书的创作历程吗,知道盗版图书有哪些危害...

02-14 17:53:04

歌剧之白毛女的赏析|全球热议

关于歌剧之白毛女的赏析白毛女起源于晋察冀边区白毛仙姑的民间传说故事中的主人公“喜儿”,其因饱受旧...

02-14 17:10:59

先进数通董秘回复:泛融相关专利做了较为清晰的描述:是一种在音频数字水印中嵌入区块链账本的技术实现方法

先进数通(300541)02月14日在投资者关系平台上答复了投资者关心的问题。

02-14 16:09:31

丰田世纪SUV确认今年登场!与汉兰达同平台 引入国内有望?

相信曾了解日本市场车型的读者应该都知道,目前丰田品牌最高级的车型是世纪(Century):一款仅有右驾,...

02-09 11:05:29

延伸线是什么_ldquo 沿线 rdquo 和 ldquo 延线 rdquo 的区别 每日时讯

1、沿线:甲地到乙地的一条路线都包含在沿线内。2、延线:延伸线的简称,如某线公交车甲地到乙地,现在...

02-09 10:06:29

时讯:三峡能源02月08日被沪股通减持246.11万股

02月08日,三峡能源被沪股通减持246 11万股,已连续8日被沪股通减持,共计3415 03万股

02-09 07:52:20

龙凤呈祥(喜庆香烟)新多少一包2022价目表|环球快报

品牌:龙凤呈祥生产公司:暂无类型:不详烟长:84过滤嘴长:0焦油含量:13mg尼古丁含量:1 2mgCO含量:...

02-09 07:57:15

天天观天下!赢在江湖mp3免费下载

今天来聊聊关于赢在江湖mp3免费下载的文章,现在就为大家来简单介绍下赢在江湖mp3免费下载,希望对各位...

02-09 04:51:55

每日动态!高考物理动能定理知识点复习

学习物理需要讲究方法和技巧,更要学会对知识点进行归纳整理。下面是学习啦小编为大家整理的高考物理动...

02-09 03:45:33

蒸馒头一般蒸多少分钟大火中火_蒸馒头一般蒸多少分钟 消息

1、蒸馒头一般蒸15~20分钟2、蒸馒头一般蒸15~20分钟就足够了,把馒头蒸太久容易蒸老,不仅口感不好吃...

02-09 01:55:00

微软Win11/10免费工具集PowerToys 0.67.1发布_焦点速读

IT之家2月8日消息,微软于今天发布了PowerToys0 67 1维护版本更新,修复了0 67 0版本中的BUG,提高...

02-09 00:10:01

速讯:怎样制作ppt幻灯片背景音乐

为了使我们制作的ppt演示文稿更加有个性,我们可以在幻灯片中制作背景音乐,那么,怎样制作呢?下面就让...

02-08 23:59:34

香港青年内地绽放飞行梦 冀飞得更“密” 全球快播报

2023年春运,是香港青年刘家维作为华夏航空的一名机长,服务内地的首个春运。近日,他在重庆告诉记者,...

02-08 22:06:19

大寨村的历史传说

中华第一村大寨村,是山西省晋中市昔阳县的一个小山村。那你知道大寨村的历史传说吗?下面是学习啦小编给...

02-08 19:56:50

02月08日18时呼和浩特疫情数据 阳了以后为什么会腰疼?应该怎么办?-全球看点

02月08日18时呼和浩特疫情数据阳了以后为什么会腰疼?应该怎么办?以下为详情!一、02月08日18时呼和浩...

02-08 19:07:48

环球时讯:深圳人找工作用啥网站_深圳找工作哪个网站好

1、中国人才热线。2、三和人才网。3、中华英才网……分门别类的都还不错!。本文分享完毕,希望对大家有...

02-08 17:52:32

今日聚焦!“世界屋脊”多宝藏阅读参考答案

说明文阅读近年来也是每年必考,完成阅读题,除了需要讲究一定的方法之外,还需要多练习,熟能生巧。为...

02-08 16:07:36

天天新消息丨2023台州个税汇算税前扣除项目一览

2023台州个税汇算税前扣除项目一览下列在2022年发生的税前扣除,纳税人可在汇算期间填报或补充扣除:(一...

02-08 15:55:30

环球即时看!吃玉米会变白吗_吃玉米会发胖吗

1、适当吃玉米不会让你发胖,但如果你无节制地吃玉米,或者吃玉米加糖来增加口感,就容易增加肥胖的风险...

02-08 15:05:59

【新视野】四环医药:与旺实生物就氢溴酸氘瑞米德韦片(VV116)的生产供应达成合作协议

南方财经2月8日电,四环医药在港交所公告称,旗下子公司吉林四环与旺实生物就口服核苷类抗新型冠状病毒1...

02-08 12:50:29

焦点速递!实验的作文300字

实验的作文300字四篇在日常学习、工作或生活中,大家都跟作文打过交道吧,作文是由文字组成,经过人的思...

02-08 12:23:18

午评:沪指震荡微跌,医药、地产等板块拉升,固态电池概念活跃

8日早盘,两市股指盘中窄幅震荡整理,创业板指小幅走高;两市半日成交约5000亿元,北向资金小幅净流入。

02-08 11:25:49

JLT型点阵激光治疗仪 环球今热点

1、JLT型点阵激光治疗仪,新一代激光换肤系统,同时具备了超脉冲和激光扫描输出功能。2、可以迅速、准确...

02-08 10:47:55

low是什么_low的意思

Low正常翻译成中文的意思是低的,低声的,矮小的。但是随着网络的普及,我们平常用它来形容一个人素质差...

02-08 08:44:56

分家协议书 世界聚看点

有关分家协议书3篇随着社会不断地进步,需要使用协议书的场合越来越多,签订协议书可以保护当事人的合法...

02-08 08:10:25

天天播报:Q我是什么意思英文_q我是什么意思

1、1、Q我吧和在线、隐身一样,都是QQ上的一种状态,一个人如果把状态设置了“Q我吧”,就说明希望有人...

02-08 07:02:50

世界微头条丨职业年金是什么东西?

专家回答(3)职业年金是指机关事业单位及其工作人员在参加基本养老保险的基础上,建立的补充养老保险制...

02-08 04:06:44

MAX相陶瓷材料的空间环境带电粒子辐射损伤机理 世界今日报

1、《MAX相陶瓷材料的空间环境带电粒子辐射损伤机理》是依托哈尔滨工业大学。2、由饶建存担任项目负责人...

02-08 03:43:46

当前快报:植物大战僵尸无尽模式最佳阵容图_植物大战僵尸无尽模式最佳阵容

1、1、植物大战僵尸2摇滚无尽挑战最强阵容:2、2、充能柚子5个加瓷砖清场,冰西瓜2个加猴子5个减速,竹...

02-08 01:07:03

肉怎么炒不腥

肉怎么炒不腥,在切好的肉里加上适量料酒与淀粉拌匀,不仅可以去腥还能使肉很鲜嫩,切记在最后加肉翻炒...

02-08 00:14:03

QQ空间说说 当前简讯

1、《QQ空间说说》是一款Android平台的应用。文章到此就分享结束,希望对大家有所帮助。

02-07 22:32:52

骨正基的作用是什么

骨正基的作用是什么,权健骨正基是在足部医学和人体工程学的基础上设计的。该产品有二万多个不同的矫正...

02-07 20:21:16

中国铁物:与湖北港口集团达成战略合作意向-今日聚焦

证券时报e公司讯,中国铁物(000927)2月7日晚间公告,近日公司与湖北港口集团有限公司(简称“湖北港口集...

02-07 19:10:59

垃圾分类分为哪几种英语_垃圾分类分为哪几种

1、主要包括废纸、塑料、玻璃、金属和布料五大类。2、废纸:主要包括报纸、期刊、图书、各种包装纸等。3...

02-07 17:52:47

超300家银行发行同业存单计划, 股份行、城商行存量居前,各类银行积极“屯粮”迎复苏

超300家银行发行同业存单计划,股份行、城商行存量居前,各类银行积极“屯粮”迎复苏,存款,信贷,城商行,...

02-07 15:57:42

学原画有用吗?有报班的必要吗? 速递

学原画有用吗?有报班的必要吗?跟很多人一样,因为喜欢动漫才喜欢的画画,刚开始学画画的时候,也是自...

02-07 15:02:24

qq公众平台为什么登不了 时讯

qq公众平台为什么登不了,账号为qq邮箱,输入时仅输入qq号码,系统会提示账号或密码不正确并无法登录平...

02-07 14:50:55

环球关注:一个人听

1、《一个人听》是由沈绵锐作词作曲编曲。2、金青、北城叔演唱的一首歌曲。文章到此就分享结束,希望对...

02-07 14:28:54

当前最新:减持比例达5%时未按规定停止交易并及时履行信披义务,宜安科技第二大股东收深交所监管函

1月19日,宜安科技第二大股东宜安实业有限公司收深交所监管函。其作为公司持股5%以上股东,在2022年5月25日至202

02-07 11:42:53

前沿资讯!为什么支付宝花呗开通不了怎么办_支付宝花呗开通不了解决办法

1、支付宝花呗开通不了解决办法  【开通步骤】  电脑端:  1 首先,你要有一个支付宝账号。2、在...

02-07 11:02:13

折叠屏市场春节周迎来“开门红”,OPPO稳居份额榜首 全球今日报

据权威市场调研机构数据显示,2023年前四周中国折叠屏市场同比增长64%,折叠屏手机成为春节消费新亮点。...

02-07 08:07:26

二人被判罚5.8万元 环球今头条

本报南京2月6日电(记者姚雪青)2月3日,江苏省南京环境资源法庭在常州市金坛区人民法院公开开庭审理了...

02-07 05:52:10

猪价“破7入6”,要跌破6元/斤?

2022年10月下旬,猪价迎来重要的观点,虽然,正处于四季度,南方即将迎来腌腊利好,但是,由于口罩问题...

02-07 02:03:56

世界消息!市医保局与黄浦签署战略合作协议

2023年2月3日下午,上海市医疗保障局和黄浦区人民政府签署“共同推进黄浦区医疗保障事业高质量发展战略...

02-06 23:33:21

焦点关注:锚定转型升级、新增124亿投资 上海金山新春“第一会”有何特点

2月6日,上海市金山区新春“第一会”——2023年优化营商环境暨投资促进工作大会召开。在现场,23个产业...

02-06 21:45:16

全球头条:橡皮用英语怎么说
当前速读:樱桃萝卜能生吃吗 樱桃萝卜可不可以生吃呢
很走心的毕业赠言给老师80句最新
这里的外环线要“站起来”了!外环东段交通功能提升工程即将开工
世界头条:洛阳启动“护苗2023”春季开学季系列宣讲活动 社会与法
歌剧之白毛女的赏析|全球热议
先进数通董秘回复:泛融相关专利做了较为清晰的描述:是一种在音频数字水印中嵌入区块链账本的技术实现方法
丰田世纪SUV确认今年登场!与汉兰达同平台 引入国内有望?
延伸线是什么_ldquo 沿线 rdquo 和 ldquo 延线 rdquo 的区别 每日时讯
时讯:三峡能源02月08日被沪股通减持246.11万股
龙凤呈祥(喜庆香烟)新多少一包2022价目表|环球快报
天天观天下!赢在江湖mp3免费下载
每日动态!高考物理动能定理知识点复习
蒸馒头一般蒸多少分钟大火中火_蒸馒头一般蒸多少分钟 消息
微软Win11/10免费工具集PowerToys 0.67.1发布_焦点速读
速讯:怎样制作ppt幻灯片背景音乐
香港青年内地绽放飞行梦 冀飞得更“密” 全球快播报
大寨村的历史传说
02月08日18时呼和浩特疫情数据 阳了以后为什么会腰疼?应该怎么办?-全球看点
环球时讯:深圳人找工作用啥网站_深圳找工作哪个网站好
今日聚焦!“世界屋脊”多宝藏阅读参考答案
天天新消息丨2023台州个税汇算税前扣除项目一览
环球即时看!吃玉米会变白吗_吃玉米会发胖吗
【新视野】四环医药:与旺实生物就氢溴酸氘瑞米德韦片(VV116)的生产供应达成合作协议
焦点速递!实验的作文300字
午评:沪指震荡微跌,医药、地产等板块拉升,固态电池概念活跃
JLT型点阵激光治疗仪 环球今热点
low是什么_low的意思
分家协议书 世界聚看点
天天播报:Q我是什么意思英文_q我是什么意思
世界微头条丨职业年金是什么东西?
MAX相陶瓷材料的空间环境带电粒子辐射损伤机理 世界今日报
当前快报:植物大战僵尸无尽模式最佳阵容图_植物大战僵尸无尽模式最佳阵容
肉怎么炒不腥
QQ空间说说 当前简讯
骨正基的作用是什么
中国铁物:与湖北港口集团达成战略合作意向-今日聚焦
垃圾分类分为哪几种英语_垃圾分类分为哪几种
超300家银行发行同业存单计划, 股份行、城商行存量居前,各类银行积极“屯粮”迎复苏
学原画有用吗?有报班的必要吗? 速递
qq公众平台为什么登不了 时讯
环球关注:一个人听
当前最新:减持比例达5%时未按规定停止交易并及时履行信披义务,宜安科技第二大股东收深交所监管函
前沿资讯!为什么支付宝花呗开通不了怎么办_支付宝花呗开通不了解决办法
折叠屏市场春节周迎来“开门红”,OPPO稳居份额榜首 全球今日报
二人被判罚5.8万元 环球今头条
猪价“破7入6”,要跌破6元/斤?
世界消息!市医保局与黄浦签署战略合作协议
焦点关注:锚定转型升级、新增124亿投资 上海金山新春“第一会”有何特点
全球热点!支付转让费会计分录_支付转让费计入什么会计科目
X 广告
资讯
X 广告

Copyright ©  2015-2022 海峡畜牧网版权所有  备案号:皖ICP备2022009963号-10   联系邮箱:396 029 142 @qq.com