事务管理
事务
访问图、索引或模式的数据库操作是在事务中执行的,以确保 ACID 属性。事务是单线程的、封闭的和独立的。可以在单个线程中启动多个事务,并且它们彼此独立。
使用事务的工作交互周期遵循以下步骤
-
开始事务。
-
执行数据库操作。
-
提交或回滚事务。
完成每个事务至关重要,因为事务获取的锁或内存只有在完成时才会释放。所有未提交的事务都将在语句结束时作为资源清理的一部分回滚。对于显式提交或回滚的事务,不需要进行资源清理,并且事务关闭是一个空操作。
在事务中执行的所有修改都保存在内存中。这意味着非常大的更新必须拆分成多个事务,以避免内存不足。 |
配置事务行为
事务设置可帮助您管理数据库中的事务,例如事务超时、并发运行的事务最大数量、在允许启动的数据库关闭继续之前允许 Neo4j 等待运行的事务完成的时间等等。有关所有可用设置,请参见事务设置。
配置并发运行的事务最大数量
默认情况下,Neo4j 可以运行最多 1000 个并发事务。要更改此值,请使用db.transaction.concurrent.maximum
设置。如果设置为 0
,则禁用限制。
配置事务超时
建议配置 Neo4j 以终止执行时间超过配置超时的事务。
-
将
db.transaction.timeout
设置为某个正的时间间隔值(例如,10s
),表示默认的事务超时。将db.transaction.timeout
设置为0
(默认值)会禁用此功能。 -
您也可以使用过程
dbms.setConfigValue('db.transaction.timeout','10s')
在每个主服务器上动态设置此值。
将超时设置为十秒。
db.transaction.timeout=10s
配置事务超时不会影响使用自定义超时执行的事务(例如,通过 Java API 或 Neo4j 驱动程序),因为自定义超时会覆盖为 db.transaction.timeout
设置的值。请注意,超时值只能被覆盖为小于 db.transaction.timeout
配置的值。
从 Neo4j 5.3 开始,您可以将事务超时设置为任何值,甚至大于 db.transaction.timeout
配置的值。
管理事务
可以使用 Cypher 命令 SHOW TRANSACTIONS
和 TERMINATE TRANSACTIONS
管理事务。TERMINATE TRANSACTIONS
命令可以与同一个查询中的多个 SHOW TRANSACTIONS
和 TERMINATE TRANSACTIONS
命令结合使用。
有关更多信息,请参见Cypher 手册 → 事务命令。