Class: ActiveRecord::ConnectionAdapters::Transaction
- Inherits:
-
Object
- Object
- ActiveRecord::ConnectionAdapters::Transaction
show all
- Defined in:
- lib/active_record/connection_adapters/abstract/transaction.rb
Overview
Defined Under Namespace
Classes: Callback
Instance Attribute Summary collapse
Instance Method Summary
collapse
Constructor Details
#initialize(connection, isolation: nil, joinable: true, run_commit_callbacks: false) ⇒ Transaction
Returns a new instance of Transaction.
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
|
# File 'lib/active_record/connection_adapters/abstract/transaction.rb', line 164
def initialize(connection, isolation: nil, joinable: true, run_commit_callbacks: false)
super()
@connection = connection
@state = TransactionState.new
@callbacks = nil
@records = nil
@isolation_level = isolation
@materialized = false
@joinable = joinable
@run_commit_callbacks = run_commit_callbacks
@lazy_enrollment_records = nil
@dirty = false
@user_transaction = joinable ? ActiveRecord::Transaction.new(self) : ActiveRecord::Transaction::NULL_TRANSACTION
@instrumenter = TransactionInstrumenter.new(connection: connection, transaction: @user_transaction)
end
|
Instance Attribute Details
#connection ⇒ Object
Returns the value of attribute connection.
150
151
152
|
# File 'lib/active_record/connection_adapters/abstract/transaction.rb', line 150
def connection
@connection
end
|
#isolation_level ⇒ Object
Returns the value of attribute isolation_level.
150
151
152
|
# File 'lib/active_record/connection_adapters/abstract/transaction.rb', line 150
def isolation_level
@isolation_level
end
|
#savepoint_name ⇒ Object
Returns the value of attribute savepoint_name.
150
151
152
|
# File 'lib/active_record/connection_adapters/abstract/transaction.rb', line 150
def savepoint_name
@savepoint_name
end
|
#state ⇒ Object
Returns the value of attribute state.
150
151
152
|
# File 'lib/active_record/connection_adapters/abstract/transaction.rb', line 150
def state
@state
end
|
#user_transaction ⇒ Object
Returns the value of attribute user_transaction.
150
151
152
|
# File 'lib/active_record/connection_adapters/abstract/transaction.rb', line 150
def user_transaction
@user_transaction
end
|
#written ⇒ Object
Returns the value of attribute written.
151
152
153
|
# File 'lib/active_record/connection_adapters/abstract/transaction.rb', line 151
def written
@written
end
|
Instance Method Details
#add_record(record, ensure_finalize = true) ⇒ Object
196
197
198
199
200
201
202
203
204
|
# File 'lib/active_record/connection_adapters/abstract/transaction.rb', line 196
def add_record(record, ensure_finalize = true)
@records ||= []
if ensure_finalize
@records << record
else
@lazy_enrollment_records ||= ObjectSpace::WeakMap.new
@lazy_enrollment_records[record] = record
end
end
|
#after_commit(&block) ⇒ Object
214
215
216
217
218
219
220
|
# File 'lib/active_record/connection_adapters/abstract/transaction.rb', line 214
def after_commit(&block)
if @state.finalized?
raise ActiveRecordError, "Cannot register callbacks on a finalized transaction"
end
(@callbacks ||= []) << Callback.new(:after_commit, block)
end
|
#after_rollback(&block) ⇒ Object
222
223
224
225
226
227
228
|
# File 'lib/active_record/connection_adapters/abstract/transaction.rb', line 222
def after_rollback(&block)
if @state.finalized?
raise ActiveRecordError, "Cannot register callbacks on a finalized transaction"
end
(@callbacks ||= []) << Callback.new(:after_rollback, block)
end
|
#before_commit(&block) ⇒ Object
206
207
208
209
210
211
212
|
# File 'lib/active_record/connection_adapters/abstract/transaction.rb', line 206
def before_commit(&block)
if @state.finalized?
raise ActiveRecordError, "Cannot register callbacks on a finalized transaction"
end
(@callbacks ||= []) << Callback.new(:before_commit, block)
end
|
#before_commit_records ⇒ Object
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
|
# File 'lib/active_record/connection_adapters/abstract/transaction.rb', line 285
def before_commit_records
if @run_commit_callbacks
if records
if ActiveRecord.before_committed_on_all_records
ite = unique_records
instances_to_run_callbacks_on = records.each_with_object({}) do |record, candidates|
candidates[record] = record
end
run_action_on_records(ite, instances_to_run_callbacks_on) do |record, should_run_callbacks|
record.before_committed! if should_run_callbacks
end
else
records.uniq.each(&:before_committed!)
end
end
@callbacks&.each(&:before_commit)
end
end
|
#closed? ⇒ Boolean
192
193
194
|
# File 'lib/active_record/connection_adapters/abstract/transaction.rb', line 192
def closed?
@state.finalized?
end
|
#commit_records ⇒ Object
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
|
# File 'lib/active_record/connection_adapters/abstract/transaction.rb', line 309
def commit_records
if records
begin
ite = unique_records
if @run_commit_callbacks
instances_to_run_callbacks_on = prepare_instances_to_run_callbacks_on(ite)
run_action_on_records(ite, instances_to_run_callbacks_on) do |record, should_run_callbacks|
record.committed!(should_run_callbacks: should_run_callbacks)
end
else
while record = ite.shift
connection.add_transaction_record(record)
end
end
ensure
ite&.each { |i| i.committed!(should_run_callbacks: false) }
end
end
if @run_commit_callbacks
@callbacks&.each(&:after_commit)
elsif @callbacks
connection.current_transaction.append_callbacks(@callbacks)
end
end
|
#dirty! ⇒ Object
180
181
182
|
# File 'lib/active_record/connection_adapters/abstract/transaction.rb', line 180
def dirty!
@dirty = true
end
|
#dirty? ⇒ Boolean
184
185
186
|
# File 'lib/active_record/connection_adapters/abstract/transaction.rb', line 184
def dirty?
@dirty
end
|
#full_rollback? ⇒ Boolean
338
|
# File 'lib/active_record/connection_adapters/abstract/transaction.rb', line 338
def full_rollback?; true; end
|
#incomplete! ⇒ Object
244
245
246
|
# File 'lib/active_record/connection_adapters/abstract/transaction.rb', line 244
def incomplete!
@instrumenter.finish(:incomplete) if materialized?
end
|
#isolation ⇒ Object
Returns the isolation level if it was explicitly set, nil otherwise
156
157
158
|
# File 'lib/active_record/connection_adapters/abstract/transaction.rb', line 156
def isolation
@isolation_level
end
|
#isolation=(isolation) ⇒ Object
160
161
162
|
# File 'lib/active_record/connection_adapters/abstract/transaction.rb', line 160
def isolation=(isolation) @isolation_level = isolation
end
|
#joinable? ⇒ Boolean
339
|
# File 'lib/active_record/connection_adapters/abstract/transaction.rb', line 339
def joinable?; @joinable; end
|
#materialize! ⇒ Object
248
249
250
251
|
# File 'lib/active_record/connection_adapters/abstract/transaction.rb', line 248
def materialize!
@materialized = true
@instrumenter.start
end
|
#materialized? ⇒ Boolean
253
254
255
|
# File 'lib/active_record/connection_adapters/abstract/transaction.rb', line 253
def materialized?
@materialized
end
|
#open? ⇒ Boolean
188
189
190
|
# File 'lib/active_record/connection_adapters/abstract/transaction.rb', line 188
def open?
!closed?
end
|
#records ⇒ Object
230
231
232
233
234
235
236
|
# File 'lib/active_record/connection_adapters/abstract/transaction.rb', line 230
def records
if @lazy_enrollment_records
@records.concat @lazy_enrollment_records.values
@lazy_enrollment_records = nil
end
@records
end
|
#restartable? ⇒ Boolean
Can this transaction’s current state be recreated by rollback+begin ?
240
241
242
|
# File 'lib/active_record/connection_adapters/abstract/transaction.rb', line 240
def restartable?
joinable? && !dirty?
end
|
#restore! ⇒ Object
257
258
259
260
261
262
263
|
# File 'lib/active_record/connection_adapters/abstract/transaction.rb', line 257
def restore!
if materialized?
incomplete!
@materialized = false
materialize!
end
end
|
#rollback_records ⇒ Object
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
|
# File 'lib/active_record/connection_adapters/abstract/transaction.rb', line 265
def rollback_records
if records
begin
ite = unique_records
instances_to_run_callbacks_on = prepare_instances_to_run_callbacks_on(ite)
run_action_on_records(ite, instances_to_run_callbacks_on) do |record, should_run_callbacks|
record.rolledback!(force_restore_state: full_rollback?, should_run_callbacks: should_run_callbacks)
end
ensure
ite&.each do |i|
i.rolledback!(force_restore_state: full_rollback?, should_run_callbacks: false)
end
end
end
@callbacks&.each(&:after_rollback)
end
|