事务处理 #

一、事务概述 #

1.1 什么是事务 #

事务是一组操作的逻辑单元,要么全部成功,要么全部失败。

text
事务特点(ACID):
├── 原子性(Atomicity):事务不可分割
├── 一致性(Consistency):数据保持一致
├── 隔离性(Isolation):事务互不干扰
└── 持久性(Durability):提交后永久保存

1.2 Neo4j事务特点 #

text
Neo4j事务特点:
├── 完全支持ACID
├── 支持嵌套事务
├── 支持分布式事务
├── 自动锁管理
└── 支持事务超时

二、隐式事务 #

2.1 自动事务 #

单条Cypher语句自动在事务中执行:

cypher
CREATE (p:Person {name: 'Tom'})
RETURN p

2.2 事务范围 #

text
隐式事务范围:
├── 单条语句
├── 自动提交
├── 失败自动回滚
└── 无需显式控制

三、显式事务 #

3.1 开始事务 #

cypher
BEGIN

3.2 提交事务 #

cypher
COMMIT

3.3 回滚事务 #

cypher
ROLLBACK

3.4 完整事务示例 #

cypher
BEGIN
CREATE (p:Person {name: 'Tom'})
CREATE (p)-[:KNOWS]->(:Person {name: 'Jerry'})
COMMIT

3.5 事务回滚示例 #

cypher
BEGIN
CREATE (p:Person {name: 'Tom'})
ROLLBACK

四、事务隔离级别 #

4.1 隔离级别 #

级别 说明 问题
READ COMMITTED 读已提交 不可重复读
REPEATABLE READ 可重复读 幻读
SERIALIZABLE 可串行化

4.2 Neo4j默认隔离级别 #

Neo4j默认使用READ COMMITTED隔离级别。

4.3 设置隔离级别 #

cypher
CALL dbms.setConfigValue('dbms.tx_isolation', 'read_committed')

五、事务超时 #

5.1 设置事务超时 #

cypher
CALL dbms.setConfigValue('dbms.transaction.timeout', '30s')

5.2 查看事务超时设置 #

cypher
CALL dbms.listConfig() YIELD name, value
WHERE name = 'dbms.transaction.timeout'
RETURN value

5.3 查看运行中的事务 #

cypher
CALL dbms.listTransactions()

5.4 终止事务 #

cypher
CALL dbms.killTransaction('transaction-id')

六、批量事务 #

6.1 使用CALL分批处理 #

cypher
UNWIND range(1, 10000) AS id
CALL {
    WITH id
    CREATE (p:Person {id: id})
} IN TRANSACTIONS OF 1000 ROWS

6.2 批量导入 #

cypher
LOAD CSV WITH HEADERS FROM 'file:///data.csv' AS row
CALL {
    WITH row
    CREATE (p:Person {id: row.id, name: row.name})
} IN TRANSACTIONS OF 1000 ROWS

6.3 批量更新 #

cypher
MATCH (p:Person)
CALL {
    WITH p
    SET p.processed = true
} IN TRANSACTIONS OF 1000 ROWS

七、并发控制 #

7.1 锁类型 #

锁类型 说明
共享锁(读锁) 允许多个事务同时读取
排他锁(写锁) 只允许一个事务写入

7.2 锁获取 #

cypher
MATCH (p:Person {id: 'person_001'})
SET p.locked = true

7.3 死锁检测 #

Neo4j自动检测死锁并回滚其中一个事务。

7.4 避免死锁 #

text
建议:
├── 按相同顺序访问资源
├── 减少事务持有时间
├── 避免长事务
└── 使用合理的隔离级别

八、事务最佳实践 #

8.1 事务大小控制 #

text
建议:
├── 单个事务不超过10000个操作
├── 使用分批处理大数据量
├── 避免在一个事务中处理过多数据
└── 合理设置事务超时

8.2 事务设计原则 #

text
原则:
├── 事务尽可能短
├── 避免在事务中执行耗时操作
├── 合理使用索引
├── 避免热点数据竞争
└── 使用乐观锁处理并发

8.3 错误处理 #

cypher
TRY
    CREATE (p:Person {id: 'person_001'})
CATCH
    RETURN 'Error: ' + errorMessage
END

九、实际应用示例 #

9.1 订单处理事务 #

cypher
BEGIN
MATCH (u:User {id: 'user_001'})
MATCH (p:Product {id: 'prod_001'})
CREATE (o:Order {
    id: 'order_001',
    status: 'pending',
    createdAt: datetime()
})
CREATE (u)-[:PLACED]->(o)
CREATE (o)-[:CONTAINS {quantity: 1}]->(p)
SET p.stock = p.stock - 1
COMMIT

9.2 转账事务 #

cypher
BEGIN
MATCH (a:Account {id: 'account_001'})
MATCH (b:Account {id: 'account_002'})
SET a.balance = a.balance - 100
SET b.balance = b.balance + 100
CREATE (t:Transaction {
    id: 'tx_001',
    amount: 100,
    from: a.id,
    to: b.id,
    createdAt: datetime()
})
CREATE (a)-[:SENT]->(t)
CREATE (t)-[:RECEIVED]->(b)
COMMIT

9.3 批量导入事务 #

cypher
LOAD CSV WITH HEADERS FROM 'file:///users.csv' AS row
CALL {
    WITH row
    MERGE (u:User {id: row.id})
    SET u += {
        name: row.name,
        email: row.email,
        createdAt: datetime()
    }
} IN TRANSACTIONS OF 1000 ROWS

十、总结 #

事务处理要点:

操作 语法 说明
开始事务 BEGIN 开始显式事务
提交事务 COMMIT 提交事务
回滚事务 ROLLBACK 回滚事务
分批事务 IN TRANSACTIONS OF n ROWS 分批处理

最佳实践:

  1. 保持事务简短
  2. 合理控制事务大小
  3. 使用分批处理大数据量
  4. 避免热点数据竞争
  5. 正确处理事务错误

下一步,让我们学习存储过程!

最后更新:2026-03-27