Module | Transaction::Simple |
In: |
lib/active_record/vendor/simple.rb
|
Simple object transaction support for Ruby
Transaction::Simple provides a generic way to add active transactional support to objects. The transaction methods added by this module will work with most objects, excluding those that cannot be Marshaled (bindings, procedure objects, IO instances, or singleton objects).
The transactions supported by Transaction::Simple are not backed transactions; that is, they have nothing to do with any sort of data store. They are "live" transactions occurring in memory and in the object itself. This is to allow "test" changes to be made to an object before making the changes permanent.
Transaction::Simple can handle an "infinite" number of transactional levels (limited only by memory). If I open two transactions, commit the first, but abort the second, the object will revert to the original version.
Transaction::Simple supports "named" transactions, so that multiple levels of transactions can be committed, aborted, or rewound by referring to the appropriate name of the transaction. Names may be any object except nil.
Copyright: | Copyright © 2003 by Austin Ziegler |
Version: | 1.1 |
Licence: | MIT-Style |
Thanks to David Black for help with the initial concept that led to this library.
include 'transaction/simple' v = "Hello, you." # => "Hello, you." v.extend(Transaction::Simple) # => "Hello, you." v.start_transaction # => ... (a Marshal string) v.transaction_open? # => true v.gsub!(/you/, "world") # => "Hello, world." v.rewind_transaction # => "Hello, you." v.transaction_open? # => true v.gsub!(/you/, "HAL") # => "Hello, HAL." v.abort_transaction # => "Hello, you." v.transaction_open? # => false v.start_transaction # => ... (a Marshal string) v.start_transaction # => ... (a Marshal string) v.transaction_open? # => true v.gsub!(/you/, "HAL") # => "Hello, HAL." v.commit_transaction # => "Hello, HAL." v.transaction_open? # => true v.abort_transaction # => "Hello, you." v.transaction_open? # => false
v = "Hello, you." # => "Hello, you." v.extend(Transaction::Simple) # => "Hello, you." v.start_transaction(:first) # => ... (a Marshal string) v.transaction_open? # => true v.transaction_open?(:first) # => true v.transaction_open?(:second) # => false v.gsub!(/you/, "world") # => "Hello, world." v.start_transaction(:second) # => ... (a Marshal string) v.gsub!(/world/, "HAL") # => "Hello, HAL." v.rewind_transaction(:first) # => "Hello, you." v.transaction_open? # => true v.transaction_open?(:first) # => true v.transaction_open?(:second) # => false v.gsub!(/you/, "world") # => "Hello, world." v.start_transaction(:second) # => ... (a Marshal string) v.gsub!(/world/, "HAL") # => "Hello, HAL." v.transaction_name # => :second v.abort_transaction(:first) # => "Hello, you." v.transaction_open? # => false v.start_transaction(:first) # => ... (a Marshal string) v.gsub!(/you/, "world") # => "Hello, world." v.start_transaction(:second) # => ... (a Marshal string) v.gsub!(/world/, "HAL") # => "Hello, HAL." v.commit_transaction(:first) # => "Hello, HAL." v.transaction_open? # => false
While Transaction::Simple is very useful, it has some severe limitations that must be understood. Transaction::Simple:
VERSION | = | '1.1.1.0'; |
Sets the Transaction::Simple debug object. It must respond to #<<. Sets the transaction debug object. Debugging will be performed automatically if there’s a debug object. The generic transaction error class.
Aborts the transaction. Resets the object state to what it was before the transaction was started and closes the transaction. If name is specified, then the intervening transactions and the named transaction will be aborted. Otherwise, only the current transaction is aborted.
If name is nil (default), the current transaction level is closed out and the changes are committed.
If name is specified and name is in the list of named transactions, then all transactions are closed and committed until the named transaction is reached.
Rewinds the transaction. If name is specified, then the intervening transactions will be aborted and the named transaction will be rewound. Otherwise, only the current transaction is rewound.
Starts a transaction. Stores the current object state. If a transaction name is specified, the transaction will be named. Transaction names must be unique. Transaction names of nil will be treated as unnamed transactions.
Alternative method for calling the transaction methods. An optional name can be specified for named transaction support.
transaction(:start): | start_transaction |
transaction(:rewind): | rewind_transaction |
transaction(:abort): | abort_transaction |
transaction(:commit): | commit_transaction |
transaction(:name): | transaction_name |
transaction: | transaction_open? |