Hi,

I've encountered a problem when I try to use a Sedna XML:DB API for Java in
a multithreading application.

When more than one thread try to store a different resource in the same
collection and the operation is bounded in one transaction I get the
following error:

SEDNA Message: ERROR SE4703 The transaction is a victim of deadlock
resolution procedure.

This is the test code for replicate the problem:




import org.xmldb.api.DatabaseManager;
import org.xmldb.api.base.Collection;
import org.xmldb.api.base.Database;
import org.xmldb.api.base.Resource;
import org.xmldb.api.base.XMLDBException;
import org.xmldb.api.modules.CollectionManagementService;
import org.xmldb.api.modules.TransactionService;
import org.xmldb.api.modules.XMLResource;

public class Test3 {
 public Test3() throws Exception {

  Database sednaDatabase;
  Class<?> clazz = Class.forName("net.cfoster.sedna.DatabaseImpl");
  sednaDatabase = (Database) (clazz.newInstance());
  DatabaseManager.registerDatabase(sednaDatabase);

  int numThread = 10;
  final Thread[] listThread = new Thread[numThread];

  for (int i = 0; i < numThread; i++) {

   final int count = i;

   listThread[i] = new Thread(new Runnable() {
    public void run() {
     Collection root = null;
     TransactionService transactionService = null;
     try {
      root =
DatabaseManager.getCollection("xmldb:sedna://localhost:5050/Test", "SYSTEM",
"MANAGER");
      transactionService = (TransactionService)
root.getService("TransactionService", "1.0");
      transactionService.begin();
      Resource r = root.createResource("test" + count,
XMLResource.RESOURCE_TYPE);
      r.setContent("<test/>");
      root.storeResource(r);
      transactionService.commit();
     } catch (Exception e) {
      e.printStackTrace();
      try {
       transactionService.rollback();
      } catch (XMLDBException e1) {
       e1.printStackTrace();
      }
     } finally {
      try {
       root.close();
      } catch (Exception e) {
       e.printStackTrace();
      }
     }

    }

   });

  }
  System.out.println("init");
  for (int i = 0; i < numThread; i++) {
   listThread[i].start();
  }

  for (int i = 0; i < numThread; i++) {
   listThread[i].join();
  }
  System.out.println("end");
  System.exit(0);
 }



 public static void main(String[] args) {
  try {
   new Test3();
  } catch (Exception e) {
   e.printStackTrace();
  }
 }
}
------------------------------------------------------------------------------
Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day 
trial. Simplify your report design, integration and deployment - and focus on 
what you do best, core application coding. Discover what's new with 
Crystal Reports now.  http://p.sf.net/sfu/bobj-july
_______________________________________________
Sedna-discussion mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/sedna-discussion

Reply via email to