Index: /trunk/sources/HeuristicLab.DataAccess.ADOHelper/DataAdapterBase.cs
===================================================================
--- /trunk/sources/HeuristicLab.DataAccess.ADOHelper/DataAdapterBase.cs	(revision 1515)
+++ /trunk/sources/HeuristicLab.DataAccess.ADOHelper/DataAdapterBase.cs	(revision 1516)
@@ -38,13 +38,4 @@
     private IDataAdapterWrapper<AdapterT, ObjT, RowT> dataAdapter;
 
-    private static Mutex lockersMutex =
-      new Mutex();
-
-    private static IDictionary<object, Mutex> lockers =
-      new Dictionary<object, Mutex>();
-
-    private static IDictionary<object, int> lockCount =
-      new Dictionary<object, int>();
-
     protected DataAdapterBase(
       IDataAdapterWrapper<AdapterT, ObjT, RowT> dataAdapter) {
@@ -52,38 +43,4 @@
     }
 
-    protected void LockRow(object id) {
-      Mutex rowLock = null;
-
-      /////begin critical section////
-      lockersMutex.WaitOne();
-
-      if (!lockers.ContainsKey(id)) {
-        lockers[id] = new Mutex();
-        lockCount[id] = 0;
-      }
-      rowLock = lockers[id];
-      lockCount[id]++;
-      
-      lockersMutex.ReleaseMutex();
-      /////end critical section////
-
-      rowLock.WaitOne();
-    }
-
-    protected void UnlockRow(object id) {
-      Mutex rowLock = lockers[id];
-      rowLock.ReleaseMutex();
-
-      /////begin critical section////
-      lockersMutex.WaitOne();
-
-      lockCount[id]--;
-      if (lockCount[id] == 0)
-        lockers.Remove(id);
-
-      lockersMutex.ReleaseMutex();
-      /////end critical section////
-    }
-    
     protected AdapterT Adapter {
       get {
@@ -222,10 +179,6 @@
       if (obj != null) {
         RowT row = null;
-        Guid locked = Guid.Empty;
 
         if (obj.Id != Guid.Empty) {
-          LockRow(obj.Id);
-          locked = obj.Id;
-
           row = GetRowById(obj.Id);
         } else {
@@ -237,13 +190,6 @@
         }
 
-        if (locked == Guid.Empty) {
-          LockRow(obj.Id);
-          locked = obj.Id;
-        }
-
         ConvertObj(obj, row);
         dataAdapter.UpdateRow(row);
-
-        UnlockRow(locked);
       }
     }
@@ -259,4 +205,23 @@
       try {
         doUpdate(obj);
+      }
+      catch (DBConcurrencyException ex) {
+        DataRow row = ex.Row;
+
+        RowT current = GetRowById(obj.Id);
+        if (current != null) {
+          //find out changes
+          for (int i = 0; i < row.ItemArray.Length; i++) {            
+            if (!row[i, DataRowVersion.Current].Equals(
+                 row[i, DataRowVersion.Original])) {
+              current[i] = row[i];
+            }
+          }
+
+          ConvertRow(current, obj);
+          //try updating again
+          Update(obj);
+        }
+        //otherwise: row was deleted in the meantime - nothing to do
       }
       finally {
@@ -283,6 +248,4 @@
 
       if (obj != null) {
-        LockRow(obj.Id);
-
         RowT row =
           GetRowById(obj.Id);
@@ -294,6 +257,4 @@
           success = true;
         }
-
-        UnlockRow(obj.Id);
       }
 
@@ -311,4 +272,15 @@
       try {
         return doDelete(obj);
+      }
+      catch (DBConcurrencyException) {
+        RowT current = GetRowById(obj.Id);
+        if (current != null) {
+          ConvertRow(current, obj);
+          //try deleting again
+          return Delete(obj);
+        } else {
+          //row has already been deleted
+          return false;
+        }
       }
       finally {
Index: /trunk/sources/HeuristicLab.DataAccess.ADOHelper/Transaction.cs
===================================================================
--- /trunk/sources/HeuristicLab.DataAccess.ADOHelper/Transaction.cs	(revision 1515)
+++ /trunk/sources/HeuristicLab.DataAccess.ADOHelper/Transaction.cs	(revision 1516)
@@ -47,5 +47,5 @@
             value.Open();
 
-          transaction = value.BeginTransaction(IsolationLevel.RepeatableRead);
+          transaction = value.BeginTransaction(IsolationLevel.ReadCommitted);
         }
       }
Index: /trunk/sources/HeuristicLab.Hive.Server.ADODataAccess/ClientAdapter.cs
===================================================================
--- /trunk/sources/HeuristicLab.Hive.Server.ADODataAccess/ClientAdapter.cs	(revision 1515)
+++ /trunk/sources/HeuristicLab.Hive.Server.ADODataAccess/ClientAdapter.cs	(revision 1516)
@@ -221,12 +221,6 @@
     protected override bool doDelete(ClientInfo client) {
       bool success = false;
-      Guid locked = Guid.Empty;
       
       if (client != null) {
-        if (client.Id != Guid.Empty) {
-          LockRow(client.Id);
-          locked = client.Id;
-        }
-
         dsHiveServer.ClientRow row =
           GetRowById(client.Id);
@@ -238,8 +232,4 @@
       }
 
-      if (locked != Guid.Empty) {
-        UnlockRow(locked);
-      }
-
       return success;
     }
Index: /trunk/sources/HeuristicLab.Hive.Server.ADODataAccess/dsHiveServer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Hive.Server.ADODataAccess/dsHiveServer.cs	(revision 1515)
+++ /trunk/sources/HeuristicLab.Hive.Server.ADODataAccess/dsHiveServer.cs	(revision 1516)
@@ -3,4 +3,7 @@
     
     public partial class dsHiveServer {
+      partial class JobDataTable {
+      }
+    
       partial class ClientGroup_ResourceDataTable {
       }
