5: Match with XTDB – Saturn Assignment
This is the
match instalment of the XTDB tutorial.
You need to get XTDB running before you can use it.
Arrival on Saturn
As you pass through the innermost ring of Saturn, A warning light appears on your communications panel. You open the message. It’s from Space Customs and reads:
We extend you the warmest welcome.
We must check papers before we can give you permission to land.
- Cronus Peaceful Nations
They are asking to see your flight manifest.
Choose your path:
As you prepare to land you open your XTDB manual to the page on
Currently there are only four primitve transaction operations in XTDB: put, delete, match and evict.
put (Writes a version of a document)
delete (Deletes a version of a document)
match (Stops a transaction if the precondition is not met.)
evict (Removes a document entirely)
match checks the current state of an entity - if the entity doesn’t match the provided doc, the transaction will not continue. You can also pass nil to check that the entity doesn’t exist prior to your transaction.
A match transaction takes the entity id, along with an expected document. Optionally you can provide a valid time.
Time in XTDB is denoted #inst 'yyyy-MM-ddThh:mm:ss'. For example, 9:30 pm on January 2nd 1999 would be written:
A complete match transaction has the form:
[::xt/match entity-id expected-doc valid-time]
Note that if there is no old-doc in the system, you can provide
nil in its place."
- XTDB manual Read More
You are happy with what you have read, and in anticipation of the assignment, you define the standalone node.
As you land on the surface of Saturn the job ticket for this assignment is unlocked.
Secure trading system
Cronus Market Technologies
We need to be shown how to ensure no trades are done without the buyer and seller having the expected funds or stock respectively
The next shuttle to the CMT office leaves in 5 Earth minutes. While you wait you use the easy ingest function you created on Pluto to put the example data into your system.
You also decide to make some Clojure functions so you can easily show Ubuku the stock and fund levels after the trades.
Just as you are finishing off your shuttle arrives.
After a short journey through the icy lower clouds of Saturn, you are met by a friendly-faced Ubuku.
We have been using XTDB for a short time now and think it is great. The problem is a human one. Occasionally we process trades without first confirming the state of the funds in the buyer's account. This means that any trades happening at approximately the same time will not observe each other's effects on the current balance, and therefore the final state of the account will not reflect all the trades correctly.
I know there is a way that we can stop this happening in XTDB.
I sent you some example data in the job ticket for you to use, I trust you found it.
Do you think you can help us?
- Ubuku Eppimami
Choose your path:
You explain to Ubuku that all they need to do to solve their problem is to use the
match operation instead of
put when they are processing their trades.
You show Ubuku the
match operation for a valid transaction. You move 10 units of Methane (
:units/CH4) each at the cost of 100 credits to Blue Energy:
You explain that because the old doc is as expected for both the buyer and the seller that the transaction goes through.
You show Ubuku the result of the trade using the function you created earlier:
They are happy that this works as he sees the 1000 credits move from Blue energy to Tombaugh Resources Ltd. and 10 units of Methane the other way.
Ubuku asks if you can show them what would happen if the state of funds in the account of a buyer did not match expectations. You show him a trade where the old doc is not as expected for Encompass trade, to buy 10,000 units of Gold from Gold Harmony.
You explain to Ubuku that this time because you have both
match operations in the same transaction, the trade does not go through. The accounts remain the same, even though the failing
match was the second operation.
Ubuku thanks you. This is just what they are looking for. You head back to the space station to see if there is another assignment waiting for you.
Back at the spaceship, there is a light waiting for you on your communications panel.
Well done, you’ve had a productive week. We have one final task for you to do before you finish for the week
You need to go to Jupiter and meet Kaarlang, it’s his last day working for us and he needs to delete his trade clients from his personal XTDB node for data protection.
- Helios Banking Inc.
You update your manifest with your most recent badge.
As you do so, you check to see if you still have the note that the porter gave you for Kaarlang back on Earth.
Feeling a bit apprehensive, you enter countdown for liftoff to Jupiter. See you soon.
This repo is mounted by: Clojure