This project can only solve distributed transactions in multiple tables in the same database in the same replica-set in mongodb.
The mongodb server does not strictly bind the transaction in which the transaction is in, and the mongodb driver can initiate transactions to achieve this. Changing this solution will extend the mongodb golang driver code, It can be used for verification in mongodb driver 1.1.2 release and mongodb 4.0.x-4.2.x replica-set mode
Extension code:
mongo/session_exposer.go
x/mongo/driver/session/session_ext.go
The extension code is mainly the underlying logic, used to activate the transaction and bind the transaction. Does not contain business logic
Related test cases:
Transaction/Transaction_test.go
Upper-level use logic:
Transaction/Transaction.go
Encapsulate business logic, realize business-level management interfaces such as opening, committing, and rolling back transactions, and provide an operation interface for the transaction uuid and the cursor id record operation of the statement execution within the transaction.
Now that the real transaction id of mongodb is directly exposed, there may be security risks in passing between different service nodes.
- Activate a transaction, generate a transaction uuid (mongodb driver provides the generation method), Transaction/Transaction.go: StartTransaction
- Activate a session through the uuid of the transaction and join a transaction of the mongodb server, Transaction/Transaction.go: ReloadSession
- Bind the transaction to the session, get the SessionContext, mongo/session_exposer.go:TxnContextWithSession
- Perform curl operations
Use project:
BlueKing Configuration Platform
Bson decoding interface priority uses the actual type as the final object, such as slice, map In the mongodb golang official driver, when bson uses interface at the top level, it puts slice and map in an object called primitive.D (golang []interface type).