Richard Kreuter and Kyle Banker on how to avoid classical RDBMS transactional systems by using compensation mechanisms, transactional messaging or transactional procedures.
Richard Kreuter and Kyle Banker work as software engineers for 10gen, the company behind MongoDB.
Strange Loop is a multi-disciplinary conference that aims to bring together the developers and thinkers building tomorrow's technology in fields such as emerging languages, alternative databases, concurrency, distributed systems, mobile development, and the web.
Ticket Sales Atomicity
However, I'm still not convinced that you need to model all the transactions at the application. In my view, I think you still need atomicity at the scope of an operation on single database. For example if you have 2 entities a parent and a child and you want the child to be deleted if the parent is deleted then you need transactions to do that otherwise if you model it in the application then you will increase the complexity of the application tremendously.
If software managed transactions are being introduced to in languages (like clojure) and frameworks to ease the development of concurrent operation then for sure transactions have their use in persistent data stores which are concurrent by nature.
More effort and complexity
The ticket sales example isn't any more realistic than the bank transfer. Nobody would implement the whole sale in a single transaction.
The realistic parts are where multiple tickets need to transit state in unison. That is trivial with transactions (and very short lived), but quite a bit of code without transactions.
Also in the ticket example the target object (ticket) is essentially locked for an extended period. What if the target object needs to be updated by other transactions?
What if a part of the transaction is an increment (or similar)? On a failure how do you know if the increment was applied or not?
so, er, distributed TP monitors. I must be getting old.
- in distributed systems you can't rely on the transaction capabilities of a single database.
- but the real world problem you're dealing with still needs transactional semantics (e.g. conservation of money)
- so build the logic of a distributed transaction manager in your application code base.
- Use transactional asynchronous messaging to communicate among the nodes in your network.
- manage the transaction as a multi-step state machine, with identified compensatory actions should any transition in the state machine fail.
Sounds a lot like the problem that spawned distributed transaction monitors 20 years ago. The tech world really does go round in circles sometimes. Wonder if Tuxedo, Top End and their ilk will rise phoenix-like?
Transactions without Transactions
Well, what happens if compensating transaction fails? What happens in highly concurrent environment?
Re: Transactions without Transactions
Re: Ticket Sales Atomicity
You end up missing out on selling tickets for which you had 2 buyers for.. did I miss something ?
Part of their argument was that, within the transactional procedure, smaller state transitions could be handled by traditional database transactions. So, you could use a database transaction to move both seats into the IN_CART status, and (optionally) to assign the order_ids. This would lock those rows over the course of the (short) transaction and prevent them from being split across 2 users.