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.uh...@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
>

Reply via email to