一个或多个要求的事务成员不存在

本文介绍了解决系统更新时出现的错误0x8007371b的方法,包括检查注册表键值一致性及删除UnstagedFiles等内容。

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

一个或多个要求的事务成员不存在

发生错误 - Package_970_for_KB3000850 错误: 0x8007371b

错误: 14107

一个或多个要求的事务成员不存在。

Changelist winner missing files - hidscanner.inf, Version = 6.3.9600.16384, pA = PROCESSOR_ARCHITECTURE_AMD64 (9), Culture neutral, VersionScope = 1 nonSxS, PublicKeyToken = {l:8 b:31bf3856ad364e35}, Type = [l:24{12}]”driverUpdate”, TypeName neutral, PublicKey neutral

一、缺少注册表键值
有三个地方的值要相一致:

HKEY_LOCAL_MACHINE\Components\DerivedData\Components
HKEY_LOCAL_MACHINE\Components\DerivedData\VersionedIndex\XXXX(winblue_XXXX)\ComponentFamilies
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\SideBySide\Winners

二、注册表中有 UnstagedFiles
在 HKEY_LOCAL_MACHINE\Components\DerivedData\VersionedIndex\XXXX(winblue_XXXX)\ComponentFamilies\XXXX\XXXX 下,如果有 UnstagedFiles,要删除。

判断的程序:

//----- (000000018017804C) ----------------------------------------------------
__int64 __fastcall CCSDirectTransaction::VerifyChangelistClosure(__int64 a1, __int64 a2)
调用
//----- (0000000180178274) ----------------------------------------------------
__int64 __fastcall CCSDirectTransaction::VerifyFilesPresent(__int64 a1, __int64 a2, struct Windows::Identity::Rtl::IRtlDefinitionIdentity *a3, __int64 a4, _DWORD *a5)
调用
//----- (000000018013F158) ----------------------------------------------------
__int64 __fastcall ComponentStore::CRawStoreLayout::IsComponentStaged(ComponentStore::CRawStoreLayout *this, struct Windows::Identity::Rtl::IRtlDefinitionIdentity *a2, struct ComponentStore::ComponentData *a3, unsigned __int32 *a4)
和
//----- (0000000180159C08) ----------------------------------------------------
__int64 __fastcall ComponentStore::CRawStoreLayout::QueryComponentUnstagedFiles(ComponentStore::CRawStoreLayout *a1, __int64 a2, __int64 a3, char *a4)



//----- (00000001801555FC) ----------------------------------------------------
__int64 __fastcall ComponentStore::CRawStoreLayout::AssertPresenceOfComponentInVersionedIndex(ComponentStore::CRawStoreLayout *this, __int64 a2, __int64 a3, _QWORD *a4, _DWORD *a5)
//----- (0000000180156A18) ----------------------------------------------------
__int64 __fastcall ComponentStore::CRawStoreLayout::GetComponentVersionedKey(__int64 a1, unsigned __int8 a2, __int64 *a3, __int64 a4)
//----- (0000000180157654) ----------------------------------------------------
__int64 __fastcall ComponentStore::CRawStoreLayout::OpenComponentFamiliesKey(ComponentStore::CRawStoreLayout *this)
......
### Spring 中同一类内方法调用导致事务失效的原因 在Spring应用程序中,当在一个服务类内的非事务方法尝试调用来自相同类的带有`@Transactional`注解的方法时,事务管理可能会按预期工作。这是因为Spring使用动态代理来拦截并增强被标注为事务性的方法调用。对于来自外部组件的服务接口调用,这种机制运作良好;但对于同一类内部的方法调用,则然。 由于这些内部调用绕过了代理层,因此它们实际上是在直接访问目标对象本身而非经过AOP织入后的代理版本[^1]。这意味着即使存在`@Transactional`这样的声明,在实际执行期间也会激活任何关联的行为约束条件。 ### 解决方案概述 为了克服这个问题,以下是几种可行的办法: #### 方法一:重构代码结构 最推荐的做法是重新设计业务逻辑流程,使得原本位于单一服务类中的多个操作能够分离成独立的服务单元。这样做仅有助于改善系统的模块化程度,还可以让每个部分更容易测试和维护。此外,这也遵循了面向对象编程的原则——高内聚低耦合。 ```java @Service public class SalaryService { @Autowired private BonusService bonusService; public void processSalaryAndBonus(Employee employee){ salaryCalculation(employee); bonusService.issueBonus(employee); // 调用其他service里的事务方法 } @Transactional private void salaryCalculation(Employee employee){ // 更新工资记录... } } @Service public class BonusService { @Transactional(propagation = Propagation.REQUIRES_NEW) public void issueBonus(Employee employee){ // 发放奖金... } } ``` 这种方法通过将同职责划分给同的Bean实现了清晰的功能边界,并确保每次跨Bean调用都能正确触发事务行为[^3]。 #### 方法二:利用委托模式 另一种选择是在需要的地方显式获取当前上下文中注册的那个已经过代理的对象实例来进行间接自我引用。这可以通过依赖注入的方式完成,即在同一类里注入自己作为属性成员变量的形式实现。过需要注意的是,这种方式虽然有效但也容易引起混淆以及潜在的风险比如循环依赖等问题[^5]。 ```java @Service public class MyServiceImpl implements MyService{ @Autowired private ApplicationContext applicationContext; @Override public void nonTxMethod(){ ((MyService)applicationContext.getBean(MyServiceImpl.class)).txMethod(); } @Override @Transactional public void txMethod(){ // 执行数据库更新等操作 } } ``` 尽管上述两种策略都可以解决问题,但从长远来看,调整架构以支持更合理的分层和服务拆分会带来更好的可扩展性和稳定性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值