non-posted transation & posted transation

文章探讨了Non-posted(需确认)与posted(无须确认)的PCIe事务类型,前者适用于高可靠性的存储器读写等,后者如音频/视频流。区分在于Non-posted涉及发送请求-接收-反馈流程,而posted直接传输。存储器读写、配置事务为非转发,内存写和消息事务为转发,使用NakDLLP和ACKDLLP进行错误检测和确认。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Non-posted(非转发)事务和posted(转发)事务都是PCIE TLP(事务层包)类型。Non-posted TLP有返回TLP,而posted 事务没有返回。

posted是一种无需确认的数据传输方式。在这种方式下,发送端将数据发送给接收端,无需等待接收端的确认信号。这种方式适用于对延迟要求较高的数据传输,如音频和视频流。

Non-posted是一种需要确认的数据传输方式。在这种方式下,发送端将数据发送给接收端,并等待接收端发送确认信号。只有在接收端发送确认信号后,发送端才能发送下一个数据包。这种方式适用于对数据完整性和可靠性要求较高的传输,如存储器读写操作。

区别:

  • Non-posted事务分为两个部分,1)发送端向接收端发送TLP请求,2)接收端收到请求完成后,3)向发送端发送完成(completion)TLP. (发送-》接收-》反馈)Non-posted事务必须等待接收到完成TLP,PCIE总线才能结束当前的TLP。
  • posted TLP不需要等待完成TLP,TLP在到达目标地之前,PCIE可以结束当前事务。

 应用:

 

存储器读事务,IO读写事务和配置事务属于非转发事务。非转发事务按照分割事务的方法处理,请求者发起TLP请求给接收者,接收者反回完成TLP给请求者。例如IO读事务,在返回TLP事务中包含读数据。

存储器写事务和消息事务都属于转发事务。转发事务不需要返回TLP来确定事务是否完成。通过数据链路层的Nak DLLP和ACK DLLP来保证转发TLP正确的传输。

### 关于无法获取事务只读状态的解决方案 当遇到 `could not retrieve transaction read-only status` 的错误时,通常表明应用程序尝试访问数据库中的某个事务的状态失败。以下是可能的原因以及解决方法: #### 可能原因分析 1. **网络连接问题** 如果 `.get_transactions()` 方法未能成功接收数据,则可能是由于网络中断或不稳定引起的[^1]。在这种情况下,建议验证客户端与服务器之间的网络连通性。 2. **权限不足** 数据库用户可能缺乏足够的权限来查询事务的相关元数据。这可以通过检查用户的权限设置并授予必要的权限来解决[^3]。 3. **API 使用不当** 调用 API 时传递的参数不正确可能导致此错误。例如,在调用 `ctx.transaction.since(account_id, id=tid)` 时,如果 `tid` 参数未正确指定或者超出了有效范围,可能会引发异常[^1]。 4. **Oracle GoldenGate 配置问题** 类似错误也可能由 Oracle GoldenGate 中的配置问题引起。例如,SQL 错误码 `14402` 表明目标表可能存在约束冲突或其他映射问题[^4]。这种情况下需要仔细审查 GoldenGate 的日志文件以定位具体问题。 5. **缓存失效或过期** 若应用依赖于某些缓存机制存储事务信息,而这些缓存已失效或被清除,则会触发此类错误。重新加载最新的事务记录可以缓解这一情况[^2]。 #### 解决方案实施步骤 尽管不允许使用诸如“首先”之类的顺序词,但仍需提供完整的处理逻辑如下: - 确认当前账户具备执行所需操作的所有必要权限。 - 审查最近的日志条目寻找任何潜在警告信号;特别是注意是否有其他关联性的错误消息提示进一步行动方向[^2]。 - 测试通过不同的时间戳再次请求交易历史记录来看是否仍然存在相同的问题。 - 对涉及的具体对象(如表结构定义)做全面审计确保它们处于健康可用状态之下。 - 如以上措施均无效则考虑联系官方技术支持团队寻求更专业的帮助指南。 ```python def debug_get_transactions(tid=0): try: response = ctx.transaction.since( account_id, id=tid ) transactions = response.get('transactions') if not transactions: raise ValueError("No transactions found.") formatted_transactions = [t.dict() for t in transactions] return formatted_transactions except Exception as e: print(f"Error occurred while fetching transactions: {e}") # Log detailed exception information here. return None ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值