kei*_*aac 5 javascript mongoose node.js
这两种方法有区别吗?
const something = Model.findById(id).
something.save({ session })
Run Code Online (Sandbox Code Playgroud)
const something = Model.findById(id).session(({ session })
something.save()
Run Code Online (Sandbox Code Playgroud)
测试时发现功能是一样的。在猫鼬事务中使用会话的正确方法应该是什么。
首先在交易中你需要async/await,
const something = await Model.findById(id).
await something.save({ session })
Run Code Online (Sandbox Code Playgroud)
但是事务允许您执行多个操作,并isolation在potentially其中一个操作失败时撤消所有操作,并且事务的主要目标是让您update multiple documents在 MongoDB 中隔离。
但在您的示例中,您更新一个集合,并且不需要进行事务。让我们继续...看下面的例子,在这个例子中结果是差异,这create()是事务的一部分,因为session事务是隔离执行的,所以除非你传递一个,否则session你findOne()不会看到结果,直到事务完成坚定的。所以结果findOne是Null
const session = await db.startSession();
session.startTransaction();
await Model.create([{ name: 'Test' }], { session: session });
let result = await Model.findOne({ name: 'Test' });//without session
session.endSession();
Run Code Online (Sandbox Code Playgroud)
在下面的示例中,这findOne()将返回结果,因为传递session意味着这findOne()将作为事务的一部分运行。
const session = await db.startSession();
session.startTransaction();
await Model.create([{ name: 'Test' }], { session: session });
let result = await Model.findOne({ name: 'Test' }).session(session);
session.endSession();
Run Code Online (Sandbox Code Playgroud)
如果您使用会话从 findOne() 或 find() 获取 Mongoose 文档,该文档将保留对会话的引用并使用该会话进行 save(),在下面的示例中不会找到,因为是result未save()提交的一部分交易,但firstReuslt不是Null
const session = await db.startSession();
session.startTransaction();
await Model.create({ name: 'Test' });
const something = await Model.findOne({ name: 'Test' }).session(session);
something.name = 'firstTest';
await something.save();
let result = await Model.findOne({ name: 'firstTest' }); //Is Null
await session.commitTransaction();
session.endSession();
firstReuslt = await Model.findOne({ name: 'firstTest' });//Is Not Null
Run Code Online (Sandbox Code Playgroud)
如果您想像下面的代码一样更新两个集合,应该使用save({ session: sess }),但是当您想更新一个集合时,您不需要,因为:
如果您使用会话从 findOne() 或 find() 获取 Mongoose 文档,该文档将保留对会话的引用并使用该会话进行 save():
const sess = await mongoose.startSession();
sess.startTransaction();
await first.save({ session: sess });
await second.save({ session: sess });
await sess.commitTransaction();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8232 次 |
| 最近记录: |