2013-06-05 74 views
1
数据

咱们例如说我有以下的客观化模式:使用物化同时写上GAE

@Cache 
@Entity 
public class CompanyViews implements Serializable, Persistence { 

    @Id 
    private Long id; 
    private Date created; 
    private Date modified; 
    private Long companyId; 

    ........ 

    private Integer counter; 

    ........ 

    @Override 
    public void persist() { 
     persist(false); 
    } 

    @Override 
    public void persist(Boolean async) { 
     ObjectifyService.register(Feedback.class); 
     // setup some variables 
     setUuid(UUID.randomUUID().toString().toUpperCase()); 
     setModified(new Date()); 
     if (getCreated() == null) { 
      setCreated(new Date()); 
     } 
     // do the persist 
     if (async) { 
      ofy().save().entity(this); 
     } else { 
      ofy().save().entity(this).now(); 
     }   
    } 
} 

我想用计数器字段来跟踪的若干意见,或号码打开或基本算什么使用整数字段。

什么,现在的情况是,对于一个GAE例如,以下将被称为:

答:

CompanyViews views = CompanyViews.findByCompanyId(...); 
views.setCounter(views.getCounter() + 1); 
views.persist(); 

和另一个实例:

B:

CompanyViews views = CompanyViews.findByCompanyId(...); 
views.setCounter(views.getCounter() + 1); 
views.persist(); 

如果他们在同一时间读取计数器或在另一个实例之前读取计数器他们会坚持下去,他们会相互覆盖。

在MySQL/Postgres中获得行级锁定,如何为GAE上的Objectify实体执行“行级锁定”?

回答

1

在同时更新实体时,您需要使用transactions

请注意,由于您更新了相同的实体,因此您将受到大约1次写入/秒的限制。要解决这个问题,请到sharding counters

+0

感谢Peter,我想最好是每天插入一个新条目并计算一次统计信息,然后将其放入一个事务中。 –

相关问题