事务
718字约2分钟
2024-07-5
事务
首先我们要明白事务的概念, 事务是数据库管理系统执行过程中的一个逻辑单位,由一系列操作组成。事务具有以下四个特性,即ACID特性:
- 原子性(Atomicity):事务是一个不可分割的工作单位,事务中的操作要么全部完成,要么全部不完成,不可能只执行其中的一部分。
- 一致性(Consistency):事务必须使数据库从一个一致性状态变到另一个一致性状态。一致性是指数据库中的数据必须满足预定义的一组完整性约束。
- 隔离性(Isolation):一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
- 持久性(Durability):一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来的其他操作或故障不应该对其有任何影响。
事务的隔离级别
Sequelize支持以下四种隔离级别:
READ_UNCOMMITTED
:未提交读,最低的隔离级别,允许读取未提交的数据,可能会导致脏读、不可重复读和幻读。READ_COMMITTED
:已提交读,允许读取已提交的数据,可以避免脏读,但可能会出现不可重复读和幻读。REPEATABLE_READ
:可重复读,确保在一个事务中多次读取相同的数据返回相同的结果,可以避免脏读和不可重复读,但可能会出现幻读。SERIALIZABLE
:可串行化,最高的隔离级别,确保在一个事务中多次读取相同的数据返回相同的结果,可以避免脏读、不可重复读和幻读,但可能会降低并发性能。 在创建事务时,可以通过options
参数指定隔离级别:
事务的创建
Sequelize提供了两种方式来创建事务:
1.非托管事务,需要自己提交,和回滚。 使用sequelize.transaction()
方法创建一个事务,该方法返回一个Promise对象,可以通过then()
方法获取事务对象。
const transaction = await sequelize.transaction();
// 成功、提交事务
transaction.commit();
// 失败、回滚事务
transaction.rollback();
- 托管事务、使用
sequelize.transaction(options)
方法创建一个事务,该方法返回一个Promise对象,可以通过then()
方法获取事务对象。options参数是一个对象,可以指定事务的隔离级别和是否自动提交。
// 完成后将自动提交
const transaction = await sequelize.transaction(
// 设置隔离级别
{ isolationLevel: Sequelize.Transaction.ISOLATION_LEVELS.READ_COMMITTED },
// 事务操作
async (t) => {
// 在这里执行数据库操作,
await User.create({ username: 'foo' }, { transaction: t });
await Profile.create({ userId: 1, age: 20 }, { transaction: t });
}
);