0 0

有关并发访问 @Transcation sychonized方法 可重复读机制 会不会出现多次修改记录5

有个问题,一个spring容器管理项目(service是单例),一个方法会被并发访问,方法为同步方法且用@Transcation注解,数据库隔离机制为 可重复读,
业务是这样的,用户交易 后 本地会产生一条 交易流水记录,status为0, 然后调用第三方支付,第三方支付 会同步异步 回调本地 这个方法两次, 这个方法内部 先判断 status是不是为0 ,然后 账户增加10元, 那假如 同步 异步同时回调,那 会不会出现 该用户账户 增加两次金额 情况
@Transcation
public synchronized void callback() {
查询交易流水记录 status
if(status == 0) {
用户帐号 增加10元
交易流水记录 status 设为1
} else {
不作为

}
2014年5月27日 10:06

3个答案 按时间排序 按投票排序

0 0

在单个JVM的情况下,是没有问题的,但是在集群的环境下有问题,因为Sychronized关键字实际上是JVM级别的,多个JVM不起作用。

建议题主采用的方式:
  1)采用悲观锁的方式,select的同时做LOCK(select XXXX for update),效率较低;
  2)直接update 加上status=0作为条件:
      int num= update ${yourTable} set status=1 where ${yourCondition} and status = 0;
      if(num == 0 ) {//update失败处理};

推荐采用第二种方式。

2014年5月29日 08:39
0 0

你这个方法是synchronized,就算是并发,一个进程访问完这个方法,别的进程才能够继续访问。在第一次访问的时候把status设置成1,后面的访问就不会进
if(status == 0) {
用户帐号 增加10元
交易流水记录 status 设为1
}这个判断了,所以不会重复增加。

打个比方,上亿的小蝌蚪(超高并发了吧)。。最后只能有一个蝌蚪进去(他进去就把卵细胞壁的性质给改变了,别的蝌蚪进不去)。。

2014年5月27日 11:51
0 0

不会,因为不管是先同步还是先异步,操作后status都会置为1,下次回调就会不作为

2014年5月27日 11:14

相关推荐

    cics Transcation gateway

    cics Transcation gatewaycics Transcation gatewaycics Transcation gateway

    transcation

    主要展示了spring事务控制的代码以及说明文件

    SQL Transcation的一些总结分享

    它确保了数据库的数据一致性和安全性,尤其在对数据执行增删时,如果发生异常和错误它就会触发事务回滚,从而确保了我们数据的一致性和安全性,下面我们将通过分四部分介绍事件(Transcation)。 1.1.2 正文 首先让...

    TRANSCATION_G.rar_On the Line

    This source code is for the transaction in banks and railways for the on line ticket generation

    Transaction

    NULL 博文链接:https://j2ee2009.iteye.com/blog/711844

    数据库设计及使用规范.pdf

    例如: UserView vw_Transcation_View 2 设计规范 2.1 规范约定 遵守数据的设计规范 3NF 规定 · 表内的每一个值都只能被表达一次。 · 表内的每一行都应该被唯一的标识(有唯一键) 。 · 表内不应该存储依赖于其他...

    基于.net sql server的连接池管理(支持事务管理)类库

    groupdal.Transcation=value; } } SqlTransaction stran = this.dal.BeginTransaction(); try { this.Transaction = stran; foreach (var user in listUser) { this.Update(user ); groupdal.Add...

    tcc-transaction-master-1.2.x.zip

    本Demo是基于Dubbo的分布式事务处理,欢迎大家评论

    Fragment的demo

    对android developer中的fragment做了一些改动。并且分别尝试用Transcation中的hide,show方法和replace方法用来对两个fragment进行切换操作。并在MainActivity中对他们后面需要执行的步骤做了简单的说明。

    MySQL复制出错 Last_SQL_Errno:1146的解决方法

    背景:我们在做数据迁移或者拆分的时候,使用Tablespace transcation 这种解决方案时,很有可能就会遇到 从库复制出错,报: Last_SQL_Errno: 1146 那么具体错误内容可能会有如下: Last_SQL_Error: Error ‘Table ...

    Hibernate的五个核心接口介绍.png

    Hibernate的五个核心接口 Configuration SessionFactory Session Transcation Query和Criteria

    spring源码所需jar文件lib_2(与上一个资源spring-framework完整源代码(spring框架源码))一起使用

    aop,beans,cache,context,core,dao,ejb,instument,jca,jdbc,jms,jmx,jndi,mail,metadate,mock,orm,remoting,scheduling,scripting,stereotype,test,transcation,ui,util,validation,web 以上数十子模块源码全部为...

    pandas 快速处理 date_time 日期格式方法

    当数据很多,且日期格式不标准时的时候,如果pandas.to_datetime 函数使用不当,会使得处理时间变得很长,提升速度的关键在于format的使用。下面举例进行说明: 示例数据: date 格式:02.01.2013 即 日.月.年 数据...

    Designing Data-Intensive Applications

    第五章讲多备份(replication), 第六章讲分区分组(partitioning/sharding) 第七章讲事务(transcation),第八章讲解在实际分布式系统中遇到的更为具体的问题。第九章讲,翻译看不懂……, consistency and consensus+ ...

    IEEE transaction on vehicular technology Appeal letter(拒稿申辩信).docx

    本文投稿 IEEE transaction on vehicular technology ,审稿周期大概40天,意见下来,其中两个审稿人,一个审稿人提出了较多意见,意见较尖锐,另一个审稿人意见很好,认同文章的创新性,指出几个语法拼写错误,但是...

    web服务规范汇总

    web服务规范汇总:WS-BPEL WS-TRANSCATION WS-NOTIDICATion ......

    TiDB as an HTAP Database

    TiDB as an HTAP Database 主讲人:PingCap CEO 刘奇 Hybrid Transactional / Analytical Processing ● ACID Transcation ● Real-time analysis ● SQL

    spring配置文件

    AOP 1.目标对象(如 biz层举例) 2.额外功能 依赖于sessionfactory 得到transcation 3.切面 控制事物属性 4 动态代理 (自动代理)

    Spring4.0+Hibernate4.0+Struts2.3整合案例

    Spring4.0+Hibernate4.0+Struts2.3整合案例:实现增删改查。... 可以解决办法是:当方法不需要事务支持的时候,使用 Session session = sessionFactory.openSession()来获得Session对象,问题解决!

Global site tag (gtag.js) - Google Analytics