Index: django/db/models/manager.py
===================================================================
--- django/db/models/manager.py	(revision 4828)
+++ django/db/models/manager.py	(working copy)
@@ -99,6 +99,9 @@
     def order_by(self, *args, **kwargs):
         return self.get_query_set().order_by(*args, **kwargs)
 
+    def select_for_update(self, *args, **kwargs):
+        return self.get_query_set().select_for_update(*args, **kwargs)
+
     def select_related(self, *args, **kwargs):
         return self.get_query_set().select_related(*args, **kwargs)
 
Index: django/db/models/query.py
===================================================================
--- django/db/models/query.py	(revision 4828)
+++ django/db/models/query.py	(working copy)
@@ -82,16 +82,17 @@
     def __init__(self, model=None):
         self.model = model
         self._filters = Q()
-        self._order_by = None        # Ordering, e.g. ('date', '-name'). If None, use model's ordering.
-        self._select_related = False # Whether to fill cache for related objects.
-        self._max_related_depth = 0  # Maximum "depth" for select_related
-        self._distinct = False       # Whether the query should use SELECT DISTINCT.
-        self._select = {}            # Dictionary of attname -> SQL.
-        self._where = []             # List of extra WHERE clauses to use.
-        self._params = []            # List of params to use for extra WHERE clauses.
-        self._tables = []            # List of extra tables to use.
-        self._offset = None          # OFFSET clause.
-        self._limit = None           # LIMIT clause.
+        self._order_by = None           # Ordering, e.g. ('date', '-name'). If None, use model's ordering.
+        self._select_for_update = False # Whether to select for update.
+        self._select_related = False    # Whether to fill cache for related objects.
+        self._max_related_depth = 0     # Maximum "depth" for select_related
+        self._distinct = False          # Whether the query should use SELECT DISTINCT.
+        self._select = {}               # Dictionary of attname -> SQL.
+        self._where = []                # List of extra WHERE clauses to use.
+        self._params = []               # List of params to use for extra WHERE clauses.
+        self._tables = []               # List of extra tables to use.
+        self._offset = None             # OFFSET clause.
+        self._limit = None              # LIMIT clause.
         self._result_cache = None
 
     ########################
@@ -211,6 +212,7 @@
             
         counter = self._clone()
         counter._order_by = ()
+        counter._select_for_update = False
         counter._select_related = False
 
         offset = counter._offset
@@ -316,6 +318,7 @@
         del_query = self._clone()
 
         # disable non-supported fields
+        del_query._select_for_update = False
         del_query._select_related = False
         del_query._order_by = []
 
@@ -398,6 +401,10 @@
         else:
             return self._filter_or_exclude(None, **filter_obj)
 
+    def select_for_update(self, true_or_false=True):
+        "Returns a new QuerySet instance with '_select_for_update' modified."
+        return self._clone(_select_for_update=true_or_false)
+
     def select_related(self, true_or_false=True, depth=0):
         "Returns a new QuerySet instance with '_select_related' modified."
         return self._clone(_select_related=true_or_false, _max_related_depth=depth)
@@ -433,6 +440,7 @@
         c.model = self.model
         c._filters = self._filters
         c._order_by = self._order_by
+        c._select_for_update = self._select_for_update
         c._select_related = self._select_related
         c._max_related_depth = self._max_related_depth
         c._distinct = self._distinct
@@ -549,6 +557,10 @@
         else:
             assert self._offset is None, "'offset' is not allowed without 'limit'"
 
+        # FOR UPDATE
+        if self._select_for_update:
+            sql.append("%s" % backend.get_for_update_sql())
+
         return select, " ".join(sql), params
 
 class ValuesQuerySet(QuerySet):
Index: django/db/backends/ado_mssql/base.py
===================================================================
--- django/db/backends/ado_mssql/base.py	(revision 4828)
+++ django/db/backends/ado_mssql/base.py	(working copy)
@@ -116,6 +116,9 @@
     if lookup_type=='day':
         return "Convert(datetime, Convert(varchar(12), %s))" % field_name
 
+def get_for_update_sql():
+    return 'WITH (UPDLOCK, HOLDLOCK)'
+
 def get_limit_offset_sql(limit, offset=None):
     # TODO: This is a guess. Make sure this is correct.
     sql = "LIMIT %s" % limit
Index: django/db/backends/mysql_old/base.py
===================================================================
--- django/db/backends/mysql_old/base.py	(revision 4828)
+++ django/db/backends/mysql_old/base.py	(working copy)
@@ -166,6 +166,9 @@
         sql = "CAST(DATE_FORMAT(%s, '%s') AS DATETIME)" % (field_name, format_str)
     return sql
 
+def get_for_update_sql():
+    return 'FOR UPDATE'
+
 def get_limit_offset_sql(limit, offset=None):
     sql = "LIMIT "
     if offset and offset != 0:
Index: django/db/backends/postgresql/base.py
===================================================================
--- django/db/backends/postgresql/base.py	(revision 4828)
+++ django/db/backends/postgresql/base.py	(working copy)
@@ -137,6 +137,9 @@
     # http://www.postgresql.org/docs/8.0/static/functions-datetime.html#FUNCTIONS-DATETIME-TRUNC
     return "DATE_TRUNC('%s', %s)" % (lookup_type, field_name)
 
+def get_for_update_sql():
+    return 'FOR UPDATE'
+
 def get_limit_offset_sql(limit, offset=None):
     sql = "LIMIT %s" % limit
     if offset and offset != 0:
Index: django/db/backends/sqlite3/base.py
===================================================================
--- django/db/backends/sqlite3/base.py	(revision 4828)
+++ django/db/backends/sqlite3/base.py	(working copy)
@@ -131,6 +131,10 @@
     # sqlite doesn't support DATE_TRUNC, so we fake it as above.
     return 'django_date_trunc("%s", %s)' % (lookup_type.lower(), field_name)
 
+def get_for_update_sql():
+    # sqlite does not support FOR UPDATE
+    return ''
+
 def get_limit_offset_sql(limit, offset=None):
     sql = "LIMIT %s" % limit
     if offset and offset != 0:
Index: django/db/backends/mysql/base.py
===================================================================
--- django/db/backends/mysql/base.py	(revision 4828)
+++ django/db/backends/mysql/base.py	(working copy)
@@ -164,6 +164,9 @@
         sql = "CAST(DATE_FORMAT(%s, '%s') AS DATETIME)" % (field_name, format_str)
     return sql
 
+def get_for_update_sql():
+    return 'FOR UPDATE'
+
 def get_limit_offset_sql(limit, offset=None):
     sql = "LIMIT "
     if offset and offset != 0:
Index: django/db/backends/oracle/base.py
===================================================================
--- django/db/backends/oracle/base.py	(revision 4828)
+++ django/db/backends/oracle/base.py	(working copy)
@@ -101,6 +101,9 @@
 def get_date_trunc_sql(lookup_type, field_name):
     return "EXTRACT(%s FROM TRUNC(%s))" % (lookup_type, field_name)
 
+def get_for_update_sql():
+    return 'FOR UPDATE'
+
 def get_limit_offset_sql(limit, offset=None):
     # Limits and offset are too complicated to be handled here.
     # Instead, they are handled in django/db/query.py.
Index: django/db/backends/postgresql_psycopg2/base.py
===================================================================
--- django/db/backends/postgresql_psycopg2/base.py	(revision 4828)
+++ django/db/backends/postgresql_psycopg2/base.py	(working copy)
@@ -97,6 +97,9 @@
     # http://www.postgresql.org/docs/8.0/static/functions-datetime.html#FUNCTIONS-DATETIME-TRUNC
     return "DATE_TRUNC('%s', %s)" % (lookup_type, field_name)
 
+def get_for_update_sql():
+    return 'FOR UPDATE'
+
 def get_limit_offset_sql(limit, offset=None):
     sql = "LIMIT %s" % limit
     if offset and offset != 0:
Index: django/db/backends/dummy/base.py
===================================================================
--- django/db/backends/dummy/base.py	(revision 4828)
+++ django/db/backends/dummy/base.py	(working copy)
@@ -34,6 +34,7 @@
 get_last_insert_id = complain
 get_date_extract_sql = complain
 get_date_trunc_sql = complain
+get_for_update_sql = complain
 get_limit_offset_sql = complain
 get_random_function_sql = complain
 get_deferrable_sql = complain
