• E
    Omit BEGIN/COMMIT statements for empty transactions · 0ac81ee6
    Eugene Kenny 提交于
    If a transaction is opened and closed without any queries being run, we
    can safely omit the `BEGIN` and `COMMIT` statements, as they only exist
    to modify the connection's behaviour inside the transaction. This
    removes the overhead of those statements when saving a record with no
    changes, which makes workarounds like `save if changed?` unnecessary.
    
    This implementation buffers transactions inside the transaction manager
    and materializes them the next time the connection is used. For this to
    work, the adapter needs to guard all connection use with a call to
    `materialize_transactions`. Because of this, adapters must opt in to get
    this new behaviour by implementing `supports_lazy_transactions?`.
    
    If `raw_connection` is used to get a reference to the underlying
    database connection, the behaviour is disabled and transactions are
    opened eagerly, as we can't know how the connection will be used.
    However when the connection is checked back into the pool, we can assume
    that the application won't use the reference again and reenable lazy
    transactions. This prevents a single `raw_connection` call from
    disabling lazy transactions for the lifetime of the connection.
    0ac81ee6
test_case.rb 5.1 KB