事务
创建和使用事务
事务是使用Connection
或EntityManager
创建的。
例如:
import { getConnection } from "typeorm";
await getConnection().transaction(transactionalEntityManager => {});
or
import { getManager } from "typeorm";
await getManager().transaction(transactionalEntityManager => {});
你想要在事务中运行的所有内容都必须在回调中执行:
import { getManager } from "typeorm";
await getManager().transaction(async transactionalEntityManager => {
await transactionalEntityManager.save(users);
await transactionalEntityManager.save(photos);
// ...
});
当在事务中工作时需要总是使用提供的实体管理器实例 - transactionalEntityManager
。
如果你使用全局管理器(来自getManager
或来自连接的 manager 可能会遇到一些 问题。
你也不能使用使用全局管理器或连接的类来执行查询。必须使用提供的事务实体管理器执行所有操作。
指定隔离级别
指定事务的隔离级别可以通过将其作为第一个参数提供来完成:
import { getManager } from "typeorm";
await getManager().transaction("SERIALIZABLE", transactionalEntityManager => {});
隔离级别实现与所有数据库不相关。
以下数据库驱动程序支持标准隔离级别(READ UNCOMMITTED
,READ COMMITTED
,REPEATABLE READ
,SERIALIZABLE
):
- MySQL
- Postgres
- SQL Server
SQlite将事务默认为SERIALIZABLE
,但如果启用了shared cache mode,则事务可以使用READ UNCOMMITTED
隔离级别。
Oracle仅支持READ COMMITTED
和SERIALIZABLE
隔离级别。