I want to delete and insert triples from a sesame repository using SPARQL
queries, and I want to execute both operations as a single transaction.

1° DELETE
2° INSERT

If an exception is thrown during the transaction, rollback is executed...
but it seems not to work. The problem is that, if an exception is thrown
during the insert query, the rollback is executed, but the previously
deleted triples are not recovered (Why?).

Here you have some code:

I have a class called OwlimConnector which wraps the repository connection
and provides some methods to make SPARQL Queries. In the constructor of
this class I set up the connection and I set the autocommit to false:

RemoteRepositoryManager repos_manager =
RemoteRepositoryManager.getInstance(SERVER_URL, USER, PASSWORD);
repos_manager.initialize();
Repository ssr = repos_manager.getRepository(REPOSITORY);
rconn = ssr.getConnection();
rconn.setAutoCommit(false);

In OwlimConnector there is a method called executeUpdate:

public void executeUpdate(String queryString) throws RepositoryException,
MalformedQueryException, UpdateExecutionException
{
  Update up = rconn.prepareUpdate(QueryLanguage.SPARQL, queryPrefixString
+ queryString);
  up.execute();
}

and these methods among others:

public void commit(){
rconn.commit();
}

public void rollback() {
rconn.rollback();
}

public void close(){
rconn.close();
}

On the other hand, I have a web service "updateUserGroup" wich uses the
previous OwlimConnector and a data access object called UserGroupDAO:

@PUT
@Consumes(MediaType.APPLICATION_XML)
public Response updateUserGroup(UserGroup ug) {

try {
    oc = new OwlimConnector();
} catch (OwlimInstantiationException e) {
    return ResponseFactory.getError(e.getErrorMessage());
}

try {
    UserGroupDAO ugdao = new UserGroupDAO(oc);
    ugdao.delete(ug.getUri());
    ugdao.add(ug);
    oc.commit();
    oc.close();
    return ResponseFactory.getOK();
} catch (MandatoryFieldException e) {
    oc.rollback();
    oc.close();
    return ResponseFactory.getError(e.getErrorMessage());
} catch (NotExistingResourceException e) {
    oc.rollback();
    oc.close();
    return ResponseFactory.getError(e.getErrorMessage());
} catch (Exception e) {
    oc.rollback();
    oc.close();
    return ResponseFactory.getError(new
GenericException(e).getErrorMessage());
}

}

1. What ugdao.delete(ug.getUri()) does is to call the OwlimConnector
method executeUpdate:

oc.executeUpdate("DELETE { " + usergroup + " ?p ?v . } WHERE { " +
usergroup + " ?p ?v . }");

Here the triples are deleted even though there is no commit!

2. What ugdao.add(ug) does is:

To check that ug.getName() is not null or spaces, otherwise the
MandatoryFieldException is thrown:

if (ug.getName() == null || ug.getName().equals("")){
throw new MandatoryFieldException("name");
}

Then, the data is inserted:

oc.executeUpdate("INSERT DATA { " + ug.getUri() + " a scmu:UserGroup ;
scmu:hasName \"" + ug.getName() + "\" . }");

When ug.getName() is null or spaces the MandatoryFieldException exception
is thrown and caught by updateUserGroup. Then the rollback is executed but
the deleted triples are not recovered.

I don´t know why this happens. Any Idea?

Thank you very much in advance



_______________________________________________
Owlim-discussion mailing list
Owlim-discussion@ontotext.com
http://ontomail.semdata.org/cgi-bin/mailman/listinfo/owlim-discussion

Reply via email to