If a deadlock occurs then the transaction will be retried so we
need to make sure that the object will still be dirty so that it
will be saved again during the retry but that the version won't
be incremented a second time.
def save_with_history!
t = Time.now.getutc
+
+ self.version += 1
+ self.timestamp = t
+
Node.transaction do
- self.version += 1
- self.timestamp = t
- save!
+ # clone the object before saving it so that the original is
+ # still marked as dirty if we retry the transaction
+ clone.save!
# Create a NodeTag
tags = self.tags
private
def save_with_history!
+ t = Time.now.getutc
+
+ self.version += 1
+ self.timestamp = t
+
Relation.transaction do
# have to be a little bit clever here - to detect if any tags
# changed then we have to monitor their before and after state.
tags_changed = false
- t = Time.now.getutc
- self.version += 1
- self.timestamp = t
- save!
+ # clone the object before saving it so that the original is
+ # still marked as dirty if we retry the transaction
+ clone.save!
tags = self.tags.clone
relation_tags.each do |old_tag|
def save_with_history!
t = Time.now.getutc
+ self.version += 1
+ self.timestamp = t
+
# update the bounding box, note that this has to be done both before
# and after the save, so that nodes from both versions are included in the
# bbox. we use a copy of the changeset so that it isn't reloaded
cs.update_bbox!(bbox) unless nodes.empty?
Way.transaction do
- self.version += 1
- self.timestamp = t
- save!
+ # clone the object before saving it so that the original is
+ # still marked as dirty if we retry the transaction
+ clone.save!
tags = self.tags
WayTag.delete_all(:way_id => id)