事务处理 #
一、事务概述 #
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 | 分批处理 |
最佳实践:
- 保持事务简短
- 合理控制事务大小
- 使用分批处理大数据量
- 避免热点数据竞争
- 正确处理事务错误
下一步,让我们学习存储过程!
最后更新:2026-03-27