同时提交同时回滚的问题

本文探讨了SQL事务处理机制,包括错误检查及回滚策略,并介绍了如何在不同服务器间执行事务操作,确保数据一致性。此外,还涉及了链接服务器的设置及分布式事务的实现。

同时提交同时回滚的问题,原题是如果没有卡的信息或是卡里没有钱就不做插入操作;

create   procedure   myP  
  as  
   
  begin   tran  
  update   db1.dbo.tableA  
  set     qty   =qty-10  
  if   @eeror<>0  
   
  rollback  
   
  else  
  update   db2.dbo.tableB  
  set     qty=qty+10  
  end    
   
  if   @error<>0  
  rollback  
  else  
  commit   tran  
   
   
  ----exec   myP  

 

 

 

 

 

 

 

2:delcare   @er1   int,@er2   int  
  BEGIN   TRANSACTION  
  Update   table1......  
  select   @er1=@@error  
  Update   table2......  
  select   @er2=@@error  
  if   @er1=0   and   @er2=0  
            COMMIT   TRANSACTION  
  else  
        ROLLBACK   TRANSACTION

 

 

3:db1和db2在不同的机器上,db1和db2之间作个链接服务器就可以了。使用链接服务器的效果是不是等同于分布式事务呢?  
  按照各位高手的回复来看,与基于一台服务器的实现方式类似,利用了事务,  
  那么这个事务是分布式的吗?需要MTS的协助吗?

 

做服务器连接用sp_addlinkedserver  
  假设以下操作在DB2所在的服务器上进行  
  sp_addlinkedserver   'db1ServerName',N'SQL   Server'  
  go  
  create   procedure   YourProcedureName  
  as  
  declare   @DB1Err   int  
  begin   tran    
      insert   db1ServerName.DB1..表名   values   (....)  
      set   @DB1Err=@@error  
      insert   DB2..表名   values   (....)  
      if   @DB1Err<>0   or   @@error<>0  
          rollback   tran  
   
  commit   tran  
    go

### 使用 `@Transactional` 注解实现 MySQL 和 MongoDB 的分布式事务 在 Spring Boot 中处理涉及多个不同数据库(如 MySQL 和 MongoDB)的分布式事务是一个复杂的问题。由于这些数据源通常由不同的供应商提供,因此无法通过标准的 JTA (Java Transaction API) 来统一管理。 对于这种情况,可以采用补偿机制或使用 XA 协议来尝试解决跨库事务的一致性问题。然而,在实际应用中更常见的是利用事件驱动架构或者 Saga 模式来进行最终一致性保障[^1]。 当涉及到具体编码实践时,如果仍然希望尽可能接近传统意义上的原子操作,则可以在服务层捕获异常并手动设置回滚状态: ```java @Service public class OrderService { @Autowired private MongoTemplate mongoTemplate; @Autowired private OrderMapper orderMapper; @Transactional(rollbackFor = Exception.class) public void createOrder(OrderInfo info){ try { // 插入到关系型数据库 orderMapper.insert(info); // 插入到NoSQL数据库 mongoTemplate.save(info); } catch(Exception e){ // 设置当前事务为只读模式,即触发回滚 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); throw new RuntimeException(e.getMessage()); } } } ``` 需要注意的是上述代码片段仅能保证单个 JVM 内部的操作按顺序执行,并不能真正意义上做到两阶段提交协议所描述的那种严格一致性的分布式事务控制[^3]。 为了达到更强的一致性和可靠性,建议考虑引入专业的分布式事务解决方案,比如 Seata 或者 Atomikos 这样的开源框架,它们提供了更加完善的特性集用于处理复杂的业务场景下的多资源并发访问需求[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值