Expand the functional model of WiredTiger developed in WT-11611 to support regular, non-prepared transactions.
To do this, we need to:
- Add transaction structs or transaction IDs to the model's data structures and APIs. This has to be done carefully, because if we feed the IDs from a real system, we may get repeated IDs across restarts.
- Add the relevant transaction management operations: begin, commit, rollback.
- Add the relevant transactional data operations: put, delete. (Reads are not necessary for our purposes, but we can still consider adding them. They may, however, take more work due to faithfully emulate MVCC.)
- Add a set_timestamp operation to create transactions with multiple commit/durable timestamps.
A transaction can be internally implemented as a collection of uncommitted updates, but we can also consider inserting uncommitted transactions directly to the model.
It is currently TBD whether we need to consider transaction conflicts at this stage.