anchor.diff:  -spec create_link(model_behaviour:model_config(), datastore:ext_key(), datastore:normalized_link_spec()) ->
       ok | datastore:create_error().
   create_link(#model_config{name = ModelName, bucket = Bucket} = ModelConfig, Key, Link) ->
  -    critical_section:run([ModelName, Bucket, Key],
  +    datastore:run_transaction(ModelName, to_binary({?MODULE, Bucket, Key}),
           fun() ->
               links_utils:create_link_in_map(?MODULE, ModelConfig, Key, Link)
           end
  
positive.code: -spec delete_links(model_behaviour:model_config(), datastore:ext_key(), [datastore:link_name()] | all) ->
      ok | datastore:generic_error().
  delete_links(#model_config{name = ModelName, bucket = Bucket} = ModelConfig, Key, all) ->
      critical_section:run([ModelName, Bucket, Key],
          fun() ->
              links_utils:delete_links(?MODULE, ModelConfig, Key)
          end
      );
  delete_links(#model_config{name = ModelName, bucket = Bucket} = ModelConfig, Key, Links) ->
      critical_section:run([ModelName, Bucket, Key],
          fun() ->
              links_utils:delete_links_from_maps(?MODULE, ModelConfig, Key, Links)
          end
  
negative.code:     | {error, Reason :: term()})) -> ok | datastore:generic_error().
  create_or_update_link(#model_config{name = ModelName, bucket = Bucket} = ModelConfig,
      Key, {LinkName, _} = Link, UpdateFun) ->
      datastore:run_transaction(ModelName, to_binary({?MODULE, Bucket, Key}),
          fun() ->
              case links_utils:fetch_link(?MODULE, ModelConfig, LinkName, Key) of
                  {error, link_not_found} ->
  