diff --git a/lib/kadeploy3/server/db.rb b/lib/kadeploy3/server/db.rb
index 00e84050b0b7375d21cbdef2ccf68809d3a68b4c..cc6e20b2c680bcc6573e1b8c50e8456909033351 100644
--- a/lib/kadeploy3/server/db.rb
+++ b/lib/kadeploy3/server/db.rb
@@ -130,6 +130,11 @@ module Database
   end
 
   class DbMysql < Db
+    def initialize()
+      super
+      @mutex = Mutex::new # avoid concurrent queries
+    end
+
     def free()
       @dbh.close if (@dbh != nil)
       @dbh = nil
@@ -177,35 +182,37 @@ module Database
     # Output
     # * return a DbResult Object and print an error if the execution failed
     def run_query(query, *args)
-      res = nil
-      begin
-        st = @dbh.prepare(query)
-        res = st.execute(*args)
-        content = nil
-        fields = st.fields
-        unless res.nil?
-          content = []
-          res.each do |r|
-            rescontent = []
-            r.each do |_,row|
-              rescontent << row
+      @mutex.synchronize do
+        res = nil
+        begin
+          st = @dbh.prepare(query)
+          res = st.execute(*args)
+          content = nil
+          fields = st.fields
+          unless res.nil?
+            content = []
+            res.each do |r|
+              rescontent = []
+              r.each do |_,row|
+                rescontent << row
+              end
+              content << rescontent
             end
-            content << rescontent
           end
+          result = DbResult.new(fields,content,st.affected_rows)
+
+          st.close
+        rescue Mysql2::Error => e
+          $stderr.puts "MySQL query: #{query.gsub(/\s+/," ").strip}" if query
+          $stderr.puts "MySQL args: #{args.inspect}" if args
+          $stderr.puts "MySQL error (code): #{e.errno}"
+          $stderr.puts "MySQL error (message): #{e.error}"
+          $stderr.puts e.backtrace
+          raise KadeployError.new(APIError::DATABASE_ERROR,nil,
+            "MySQL error ##{e.errno}: #{e.error.gsub(/\s+/," ").strip}")
         end
-        result = DbResult.new(fields,content,st.affected_rows)
-
-        st.close
-      rescue Mysql2::Error => e
-        $stderr.puts "MySQL query: #{query.gsub(/\s+/," ").strip}" if query
-        $stderr.puts "MySQL args: #{args.inspect}" if args
-        $stderr.puts "MySQL error (code): #{e.errno}"
-        $stderr.puts "MySQL error (message): #{e.error}"
-        $stderr.puts e.backtrace
-        raise KadeployError.new(APIError::DATABASE_ERROR,nil,
-          "MySQL error ##{e.errno}: #{e.error.gsub(/\s+/," ").strip}")
+        return result
       end
-      return result
     end
   end
 end