Basically, what you are talking about is Software Transactional Memory.
According to��https://en.wikipedia.org/wiki/Software_transactional_memory#Smalltalk
there *is* STM support for Pharo at
http://source.lukas-renggli.ch/transactional/
although the last version there is from 2012, and there have been major changes to Pharo
since then, so it probably doesn't work any longer.

You could probably make a TransactionalObject class with a 'lastTransaction'
instance variable, and a noteChange method that checks if lastTransaction ==
Transaction current, and if not, pushes self -> self shallowCopy onto a stack
inside Transaction and sets lastTransaction to Transaction current.�� Then to
roll back a transaction, peel back original -> backup records from the stack
and do original copyFrom: backup for each of them.

Please don't ask me to think about combining this with concurrency.

On 31 July 2018 at 01:16, Peter Uhn��k <i.uhnak@gmail.com> wrote:
Hi,

is there some library or approach how to do transactions in pharo?
And I don't mean database transactions, but directly in memory on Pharo objects... e.g.

p := Person new.

transaction do: [
�� �� p name: 'Nobody'.
�� �� p age: 70.
] on: Error do: [
�� �� transaction rollback.
].

self assert: p name equals: 'Nobody'.
self assert: p age equals: 70.

transaction do: [
�� �� p name: 'Somebody'.
�� �� p age: 1 / 0.
] on: Error do: [
�� �� transaction rollback.
].

self assert: p name equals: 'Nobody'.
self assert: p age equals: 70.

Any pointers appreciated.

Thanks,
Peter