transaction: operate on mutable array then diff to internal obs._list