Skip to content

Database deadlock when messages are sent rapidly #235

@kiootic

Description

@kiootic

Reproduction steps:
send messages between two users rapidly (e.g. 0.5s)

Expected result:
messages are sent normally

Actual result:
sometimes error would occur:

Error Domain=SKYOperationErrorDomain Code=10000 "An unexpected error has occurred." UserInfo={SKYErrorMessage=(psycopg2.extensions.TransactionRollbackError) deadlock detected
DETAIL:  Process 1402 waits for ShareLock on transaction 33541; blocked by process 1543.
Process 1543 waits for ShareLock on transaction 33595; blocked by process 1402.
HINT:  See server log for query details.
CONTEXT:  while updating tuple (11,10) in relation "user_conversation"
 [SQL: '\n            UPDATE %(schema_name)s.user_conversation\n            SET\n                "_updated_at" = CURRENT_TIMESTAMP\n            WHERE\n                "conversation" = %(conversation_id)s\n                AND "user" = %(user_id)s\n        '] [parameters: {'schema_name': <psycopg2.extensions.AsIs object at 0x7f8ecc0a4540>, 'conversation_id': 'a1924405-71d8-4262-ae46-2baf5e175c38', 'user_id': 'c1001719-8171-44c7-9a33-d356c407b01a'}] (Background on this error at: http://sqlalche.me/e/e3q8), NSErrorFailingURLKey=http://127.0.0.1:3000/record/save, trace=Traceback (most recent call last):
  File "/usr/local/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 1193, in _execute_context
    context)
  File "/usr/local/lib/python3.6/site-packages/sqlalchemy/engine/default.py", line 509, in do_execute
    cursor.execute(statement, parameters)
psycopg2.extensions.TransactionRollbackError: deadlock detected
DETAIL:  Process 1402 waits for ShareLock on transaction 33541; blocked by process 1543.
Process 1543 waits for ShareLock on transaction 33595; blocked by process 1402.
HINT:  See server log for query details.
CONTEXT:  while updating tuple (11,10) in relation "user_conversation"


The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/usr/local/lib/python3.6/site-packages/skygear/transmitter/common.py", line 43, in wrapper
    return dict(result=f(self, *args, **kwargs))
  File "/usr/local/lib/python3.6/site-packages/skygear/transmitter/common.py", line 102, in call_func
    return self.hook(obj, param)
  File "/usr/local/lib/python3.6/site-packages/skygear/transmitter/common.py", line 187, in hook
    returned = func(record, original_record, conn)
  File "/usr/local/lib/python3.6/site-packages/skygear/decorators.py", line 90, in hook_func
    func(record, original_record, db)
  File "chat/chat/message_handlers.py", line 336, in message_after_save_handler
    return handle_message_after_save(record, original_record, conn)
  File "chat/chat/message_handlers.py", line 193, in handle_message_after_save
    'user_id': current_user_id()
  File "/usr/local/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 942, in execute
    return self._execute_text(object, multiparams, params)
  File "/usr/local/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 1104, in _execute_text
    statement, parameters
  File "/usr/local/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 1200, in _execute_context
    context)
  File "/usr/local/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 1413, in _handle_dbapi_exception
    exc_info
  File "/usr/local/lib/python3.6/site-packages/sqlalchemy/util/compat.py", line 265, in raise_from_cause
    reraise(type(exception), exception, tb=exc_tb, cause=cause)
  File "/usr/local/lib/python3.6/site-packages/sqlalchemy/util/compat.py", line 248, in reraise
    raise value.with_traceback(tb)
  File "/usr/local/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 1193, in _execute_context
    context)
  File "/usr/local/lib/python3.6/site-packages/sqlalchemy/engine/default.py", line 509, in do_execute
    cursor.execute(statement, parameters)
sqlalchemy.exc.OperationalError: (psycopg2.extensions.TransactionRollbackError) deadlock detected
DETAIL:  Process 1402 waits for ShareLock on transaction 33541; blocked by process 1543.
Process 1543 waits for ShareLock on transaction 33595; blocked by process 1402.
HINT:  See server log for query details.
CONTEXT:  while updating tuple (11,10) in relation "user_conversation"
 [SQL: '\n            UPDATE %(schema_name)s.user_conversation\n            SET\n                "_updated_at" = CURRENT_TIMESTAMP\n            WHERE\n                "conversation" = %(conversation_id)s\n                AND "user" = %(user_id)s\n        '] [parameters: {'schema_name': <psycopg2.extensions.AsIs object at 0x7f8ecc0a4540>, 'conversation_id': 'a1924405-71d8-4262-ae46-2baf5e175c38', 'user_id': 'c1001719-8171-44c7-9a33-d356c407b01a'}] (Background on this error at: http://sqlalche.me/e/e3q8)
, SKYOperationErrorHTTPStatusCodeKey=200, SKYErrorName=UnexpectedError, NSLocalizedDescription=An unexpected error has occurred.}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions