brickyang / egg-mongo-native

MongoDB egg.js plugin using native driver.
MIT License
75 stars 11 forks source link

transactions 事务支持 #27

Closed Akimotorakiyu closed 5 years ago

Akimotorakiyu commented 5 years ago

Mongo 4.X 开始支持 跨collection transactions 事务支持. egg-mongo-native也支持一下呗。

Akimotorakiyu commented 5 years ago

或者把MongodbClient放出来,让事务功能可以用。

brickyang commented 5 years ago

直接暴露 MongoClient 太粗暴了。

我现在有点拿不准是暴露一个 ClientSession,还是在 Startransaction() 中每次 start 一个新 session。

Akimotorakiyu commented 5 years ago

应该是每次Startransaction()开始一个新session

Akimotorakiyu commented 5 years ago

@brickyang 兄dei,先给一个可以救急的东西... ...先用着吗?༼ ∗ •̀ (oo) •́ ∗ ༽ 揭不开锅了要!

brickyang commented 5 years ago

我正在更新中,但是仍有细节需要考虑。

你可以先改本地源码?

Akimotorakiyu commented 5 years ago

@SilverLeaves 那我先不揭锅了༼ ∗ •̀ (oo) •́ ∗ ༽,你别着急

brickyang commented 5 years ago

先发小版本吧,增加一个 startTransaction(),返回 session 之后放在 collection 操作的 options 里,标准用法。

下一个大版本需要整体优化下 API。

brickyang commented 5 years ago

@SilverLeaves 可以试试 npm i -S egg-mongo-native@next。API 参考 easy-mongodb

期待反馈。

Akimotorakiyu commented 5 years ago

给了两个方法,一个带参数,一个不带参数。。。 我直接用不带参的startSession,没毛病吧

startSession startTransaction

brickyang commented 5 years ago

startTransaction() 内部也是调用 startSession(),也返回 session。后者是以防需要 session 干别的。

你直接调用 startSession() 就自己再调用 session.startTransaction() 一下。

startSession() 也是(可以)有参数的,我记得应该补上了。

另外现在也可以访问到 app.mongo.client

brickyang commented 5 years ago

下一步的计划是 startTransaction() 返回一个包装好的 session,在这个 session 上可以直接调用目前 db 的 API,不需要自己显式地使用 options = { session }。类似于:

const sess = app.mongo.startTransaction();
sess.insertOne(...);
sess.findOneAndUpdate(...);
sess.commitTransaction();
Akimotorakiyu commented 5 years ago

(〜^㉨^)〜棒呆,静候佳音

美滋滋٩(๑`н´๑)۶

我是伸手党༼ ∗ •̀ (oo) •́ ∗ ༽我喂你袋盐

brickyang commented 5 years ago

你实际用了吗?如果没 bug 就合了。