Index: /trunk/Nebulous-Server/lib/Nebulous/Server.pm
===================================================================
--- /trunk/Nebulous-Server/lib/Nebulous/Server.pm	(revision 23459)
+++ /trunk/Nebulous-Server/lib/Nebulous/Server.pm	(revision 23460)
@@ -163,5 +163,5 @@
 
     my $uri;
-TRANS: do {
+TRANS: while (1) {
         eval {
             {
@@ -237,5 +237,6 @@
             $log->logdie("error: $@");
         }
-    } while ($@);
+        last;
+    }
 
     $log->debug("leaving");
@@ -275,5 +276,5 @@
     $newkey = parse_neb_key($newkey);
 
-TRANS: do {
+TRANS: while (1) {
         eval {
             # rename storage_object
@@ -300,5 +301,6 @@
             $log->logdie("database error: $@");
         }
-    } while $@;
+        last;
+    } 
 
     $log->debug("leaving");
@@ -342,5 +344,5 @@
     # key1.swap -> key2
 
-TRANS: do {
+TRANS: while (1) {
         eval {
             {
@@ -395,5 +397,6 @@
             $log->logdie("database error: $@");
         }
-    } while ($@);
+        last;
+    }
 
     $log->debug("leaving");
@@ -466,5 +469,5 @@
 
     my $uri;
-TRANS: do {
+TRANS: while (1) {
         eval {
             my $so_id;
@@ -523,7 +526,12 @@
             }
             $log->debug("rollback");
+            if ($@ =~ /Deadlock found/) {
+                $log->warn("database deadlock retrying transaction: $@");
+                redo TRANS;
+            }
             $log->logdie("error: $@");
         }
-    } while ($@);
+        last;
+    }
 
     $log->debug("leaving");
@@ -565,5 +573,5 @@
     my $write_lock;
 
-TRANS: do {
+TRANS: while (1) {
         eval {
             {
@@ -634,5 +642,6 @@
             $log->logdie("error: $@");
         }
-    } while ($@);
+        last;
+    }
 
     $log->debug("leaving");
@@ -674,5 +683,5 @@
     my $write_lock;
 
-TRANS: do {
+TRANS: while (1) {
         eval {
             {
@@ -746,5 +755,6 @@
             $log->logdie("error: $@");
         }
-    } while ($@);
+        last;
+    }
 
     $log->debug( "leaving" );
@@ -788,5 +798,5 @@
     $key = parse_neb_key($key);
 
-TRANS: do {
+TRANS: while (1) {
         eval {
             my $query;
@@ -828,5 +838,6 @@
             $log->logdie("database error: $@");
         }
-    } while ($@);
+        last;
+    }
 
     $log->debug("leaving");
@@ -957,5 +968,5 @@
     $key = parse_neb_key($key);
 
-TRANS: do {
+TRANS: while (1) {
         eval {
             my $query = $db->prepare_cached( $sql->remove_object_xattr );
@@ -981,5 +992,6 @@
             $log->logdie("database error: $@");
         }
-    } while ($@);
+        last;
+    } 
 
     $log->debug("leaving");
@@ -1143,5 +1155,5 @@
     $log->debug( "entered - @_" );
 
-TRANS: do {
+TRANS: while (1) {
         eval {
             my $so_id;
@@ -1209,5 +1221,6 @@
             $log->logdie( "database error: $@" );
         }
-    } while ($@);
+        last;
+    }
 
     $log->debug( "leaving" );
