Мы используем neo4j
и py2neo
для выполнения запросов шифрования для выполнения любых операций обновления или чтения neo4j
.
Недавно мы столкнулись с проблемой, при которой все запросы шифров не будут выполняться, поэтому попытались найти все транзакции в neo4j, используя CALL dbms.listTransactions()
, и выяснить причину этого - транзакции, которые получили значительное количество блокировок и которые не связан ни с одним запросом, плюс эта транзакция выполняется с часов.
В части кода я всегда проверяю, чтобы в конце транзакция не оставалась открытой, даже если в запросе шифра или любой другой части кода было какое-либо исключение, я откатываю транзакцию, чтобы полученные блокировки могли быть сняты.
Ниже приведен скриншот запроса списка транзакций: -
![enter image description here](https://i.stack.imgur.com/Om3oi.png)
Как видно, query-2
заблокирован вышеупомянутой транзакцией.
Теперь я знаю, что могу использовать neo.conf
, чтобы ограничить время для транзакции, но я не большой поклонник этого, так как иногда это может привести к неправильному завершению транзакции, плюс очень важно выяснить и решить, что это за транзакция с ни о каком запросе и как можно позаботиться.
Эта транзакция сбрасывается только тогда, когда мы перезапускаем сервер neo4j и через некоторое время она появляется снова.
Ниже приведен очень грубый фрагмент кода для создания, фиксации и отката транзакции neo4j.
graph_obj = Graph(host=neo4j_auth_obj["host"], port=neo4j_auth_obj["port"],
user=neo4j_auth_obj["user_name"], password=neo4j_auth_obj["password"])
neo_transaction = graph_obj.begin()
try:
cypher_query = "a valid cypher query"
neo_transaction.run(cypher_query)
neo_transaction.commit()
except Exception:
neo_transaction.rollback()
О чем может быть эта пустая транзакция?