由真实场景联想到的对事务认识的二三事

真实场景:公司b2c app测试过程中,前端测试发现一个bug--从虚拟钱包转账到微信,微信收款成功,虚拟钱包金额无扣减
1.认识的误区一:事务里的资源都是能够rollback的.

问题代码逻辑如下

//伪代码
begin translation
//调用微信支付接口
boolean callResult= remote.transf(......);
if(callResult)
{
   //操作本地数据库
   boolean payResult= local.pay(......);
   if(payResult)
   {
      commit;
   }
   else
   {
     rollback;
   }
}
else
{
  rollback
}
end translation

问题原因:微信转账接口对调用方而言,不支持rollback,因此这是一个"伪事务",
真正的事务应当是无论是本地事务还是分布式事务
参与事务的任何一个资源管理器关联的资源是支持commit和rollback的;

解决方案:调整调用次序

//伪代码
begin translation
//操作本地数据库
boolean callResult = local.pay(......);
if(callResult)
{
   //调用微信支付接口
   boolean payResult= remote.transf(......);
   if(payResult)
   {
      commit;
   }
   else
   {
     rollback;
   }
}
else
{
  rollback
}
end translation

2.认识误区二:事务是有效的
http://www.cnblogs.com/xiaoyuanding/p/3947986.html

分布式事务可以简化为本地事务
简化为本地事务有效吗?
由于调用了两次删除文件的操作,所以无论怎么调整调用次序,本地事务都不起作用,因此使用事务跟不用事务结果一样

解决方案:借助持久化消息队列投递消息或定时任务+消息状态字段来删除文件,如遇不成功,不断重试,直到成功。

时间: 2024-11-05 22:39:30

由真实场景联想到的对事务认识的二三事的相关文章

WSFC真实场景仲裁处理

在本篇文章中,老王讲从实际应用的角度来为大家讲解下群集仲裁,在真实情况下的呈现,以及出现不同点数的节点宕机应该如何处理,在老王本篇文章中以及以后的文章中,我并不会去讲如何去安装一个群集,后面我们也将主要专注于群集的深入知识,概念理解,架构设计,迁移优化. 本篇文章分为以下几个场景 场景1.两个站点,三个节点的群集,假设北京站点两个节点,保定站点一个节点,群集采用多数节点方式,我们将依次测试重现,群集坏掉1个节点会发生什么,应该如何处理,群集坏掉两个节点会发生什么,应该如何处理. 场景2.两个站点

真实场景舞台再现 解读企业接发包全过程

6月19日的“解放号”商用发布会上,为了使用户更加清楚的熟悉“解放号”平台接发包的流程和服务,中软国际借用真实场景舞台再现的形式,将发包用户巧虎教育集团CTO牟红女士请到了现场,为大家重新演绎了她与“解放号”团队沟通的过程,这种耳目一新的环节令人印象深刻. 现场模拟“解放号”团队找到牟总当面沟通的情景,牟总主要围绕平台能不能找人.找的人是否合适.发包定价.平台能否管理过程.资金安全等多个问题进行了沟通.现在让我们回顾一下当时的场景,抽取一些干货来了解. 牟总:首先,我很想知道在“解放号”上,能帮

Spring事务管理(二)

声明式事务管理方式一:基于TransactionProxyFactoryBean的方式(不常用,需要对每个要进行增强的类进行配置TransactionProxyFactoryBean) 1.引入xml配置约束 2. 声明式事务管理方式二:基于AspectJ的XML方式的配置:(经常使用,一旦配置好,类上不需要添加任何东西) 1.引入xml配置约束 2.  声明式事务管理方式三:基于注解的方式(经常使用,配置简单,但是需要在业务层类上添加@Transactional的注解) 1. 2.只要在需要进

postgresql事务的操作二

参照网页: http://www.php100.com/manual/PostgreSQL8/sql-set-transaction.html show transaction isolation level ; 查看事务隔离级别 testdb=# show transaction isolation level; transaction_isolation----------------------- read committed(1 行记录) testdb=> set transaction

Jmeter(五十)_性能测试模拟真实场景下的用户操作

概述 我们在做性能测试的时候,不同的视角看到的结果都不一样. 例如响应时间 用户通过客户端向服务端发出请求的时间为: T1服务端接收到请求,处理该请求的时间为:T2服务端返回数据给客户端时间为: T3客户端接收到响应数据,处理数据呈现给用户时间为:T4 从系统视角来看:系统的响应时间Ts= T1+T2+T3.该时间没有包括客户端对数据处理并呈现的时间T4 从用户视角来看:用户眼中的的响应时间:Tu = T1+T2+T3+T4.用户通过客户端发出业务请求,到客户端展现相应的请求结果,这个过程的时间

真实场景中WebRTC 用到的服务 STUN, TURN 和 signaling

FQ收录转自:WebRTC in the real world: STUN, TURN and signaling WebRTC enables peer to peer communication. BUT... WebRTC still needs servers: For clients to exchange metadata to coordinate communication: this is called signaling. To cope with network addre

Redis事务【十二】

一.概述: 和众多其它数据库一样,Redis作为NoSQL数据库也同样提供了事务机制.在Redis中,MULTI/EXEC/DISCARD/WATCH这四个命令是我们实现事务的基石.相信对有关系型数据库开发经验的开发者而言这一概念并不陌生,即便如此,我们还是会简要的列出Redis中事务的实现特征: 1). 在事务中的所有命令都将会被串行化的顺序执行,事务执行期间,Redis不会再为其它客户端的请求提供任何服务,从而保证了事物中的所有命令被原子的执行. 2). 和关系型数据库中的事务相比,在Red

深入Spring数据库事务管理(二)

数据库的相关知识 1.数据库事务ACID特性 原子性(Atomicity): 说的是一个事物内所有操作共同组成一个原子包,要么全部成功,要么全部失败.这是最基本的特性,保证了因为一些其他因素导致数据库异常,或者宕机. 一致性(Consistency): 数据库事物的一致性就规定了事物提交前后,永远只可能存在事物提交前的状态和事物提交后的状态,从一个一致性的状态到另一个一致性状态,而不可能出现中间的过程态.也就是说事物的执行结果是量子化状态,而不是线性状态. 隔离性(Isolation): 事物的

实例详解Spring的事务传播机制(二)

上面我们讨论了NEVER和MANDATORY的作用,下面我们接着讨论其他情况. 3. SUPPORTS 如果有事务则加入该事务,如果没有存在的事务则以非事务的方式运行. 我们先让insertSubTable方法在无事务的情况下运行.配置文件为: <tx:attributes>       <!--     <tx:method name="insertSuperTable" propagation="REQUIRED"/>      -