# Transaction

Summary:[Inherited Methods](https://developer.android.com/reference/android/arch/persistence/room/Transaction#inhmethods)  

# Transaction

| The`android.arch`Architecture Components packages are no longer maintained. They have been superseded by the corresponding[androidx.\*](https://developer.android.com/jetpack/androidx/migrate)packages. See[androidx.room.Transaction](https://developer.android.com/reference/androidx/room/Transaction)instead.

`
public


abstract
@interface
Transaction
`  
`


implements

Annotation


`

|-------------------------------------------|
| android.arch.persistence.room.Transaction |

<br />

*** ** * ** ***

Marks a method in a[Dao](https://developer.android.com/reference/android/arch/persistence/room/Dao)class as a transaction method.

When used on a non-abstract method of an abstract[Dao](https://developer.android.com/reference/android/arch/persistence/room/Dao)class, the derived implementation of the method will execute the super method in a database transaction. All the parameters and return types are preserved. The transaction will be marked as successful unless an exception is thrown in the method body.

Example:  

```
 @Dao
 public abstract class ProductDao {
    @Insert
     public abstract void insert(Product product);
    @Delete
     public abstract void delete(Product product);
    @Transaction
     public void insertAndDeleteInTransaction(Product newProduct, Product oldProduct) {
         // Anything inside this method runs in a single transaction.
         insert(newProduct);
         delete(oldProduct);
     }
 }
 
```

When used on a[Query](https://developer.android.com/reference/android/arch/persistence/room/Query)method that has a`Select`statement, the generated code for the Query will be run in a transaction. There are 2 main cases where you may want to do that:

1. If the result of the query is fairly big, it is better to run it inside a transaction to receive a consistent result. Otherwise, if the query result does not fit into a single[CursorWindow](https://developer.android.com/reference/android/database/CursorWindow.html), the query result may be corrupted due to changes in the database in between cursor window swaps.
2. If the result of the query is a Pojo with[Relation](https://developer.android.com/reference/android/arch/persistence/room/Relation)fields, these fields are queried separately. To receive consistent results between these queries, you probably want to run them in a single transaction.

Example:  

```
 class ProductWithReviews extends Product {
     @Relation(parentColumn = "id", entityColumn = "productId", entity = Review.class)
     public List<Review> reviews;
 }
 @Dao
 public interface ProductDao {
     @Transaction @Query("SELECT * from products")
     public List<ProductWithReviews> loadAll();
 }
 
```
If the query is an async query (e.g. returns a[LiveData](https://developer.android.com/reference/android/arch/lifecycle/LiveData)or RxJava Flowable, the transaction is properly handled when the query is run, not when the method is called.

Putting this annotation on an[Insert](https://developer.android.com/reference/android/arch/persistence/room/Insert),[Update](https://developer.android.com/reference/android/arch/persistence/room/Update)or[Delete](https://developer.android.com/reference/android/arch/persistence/room/Delete)method has no impact because they are always run inside a transaction. Similarly, if it is annotated with[Query](https://developer.android.com/reference/android/arch/persistence/room/Query)but runs an update or delete statement, it is automatically wrapped in a transaction.

## Summary

| ### Inherited methods |
|-----------------------|---|
| From interface` java.lang.annotation.Annotation ` |-----------------------------------------|-------------------------| | ` abstract Class<? extends Annotation>` | ` annotationType() `    | | ` abstract boolean`                     | ` equals(Object arg0) ` | | ` abstract int`                         | ` hashCode() `          | | ` abstract String`                      | ` toString() `          | ||

-

  ## Annotations

  - [ColumnInfo](https://developer.android.com/reference/android/arch/persistence/room/ColumnInfo)
  - [ColumnInfo.Collate](https://developer.android.com/reference/android/arch/persistence/room/ColumnInfo.Collate)
  - [ColumnInfo.SQLiteTypeAffinity](https://developer.android.com/reference/android/arch/persistence/room/ColumnInfo.SQLiteTypeAffinity)
  - [Dao](https://developer.android.com/reference/android/arch/persistence/room/Dao)
  - [Database](https://developer.android.com/reference/android/arch/persistence/room/Database)
  - [Delete](https://developer.android.com/reference/android/arch/persistence/room/Delete)
  - [Embedded](https://developer.android.com/reference/android/arch/persistence/room/Embedded)
  - [Entity](https://developer.android.com/reference/android/arch/persistence/room/Entity)
  - [ForeignKey](https://developer.android.com/reference/android/arch/persistence/room/ForeignKey)
  - [ForeignKey.Action](https://developer.android.com/reference/android/arch/persistence/room/ForeignKey.Action)
  - [Ignore](https://developer.android.com/reference/android/arch/persistence/room/Ignore)
  - [Index](https://developer.android.com/reference/android/arch/persistence/room)
  - [Insert](https://developer.android.com/reference/android/arch/persistence/room/Insert)
  - [OnConflictStrategy](https://developer.android.com/reference/android/arch/persistence/room/OnConflictStrategy)
  - [PrimaryKey](https://developer.android.com/reference/android/arch/persistence/room/PrimaryKey)
  - [Query](https://developer.android.com/reference/android/arch/persistence/room/Query)
  - [RawQuery](https://developer.android.com/reference/android/arch/persistence/room/RawQuery)
  - [Relation](https://developer.android.com/reference/android/arch/persistence/room/Relation)
  - [SkipQueryVerification](https://developer.android.com/reference/android/arch/persistence/room/SkipQueryVerification)
  - [Transaction](https://developer.android.com/reference/android/arch/persistence/room/Transaction)
  - [TypeConverter](https://developer.android.com/reference/android/arch/persistence/room/TypeConverter)
  - [TypeConverters](https://developer.android.com/reference/android/arch/persistence/room/TypeConverters)
  - [Update](https://developer.android.com/reference/android/arch/persistence/room/Update)
-

  ## Classes

  - [DatabaseConfiguration](https://developer.android.com/reference/android/arch/persistence/room/DatabaseConfiguration)
  - [InvalidationTracker](https://developer.android.com/reference/android/arch/persistence/room/InvalidationTracker)
  - [InvalidationTracker.Observer](https://developer.android.com/reference/android/arch/persistence/room/InvalidationTracker.Observer)
  - [Room](https://developer.android.com/reference/android/arch/persistence/room/Room)
  - [RoomDatabase](https://developer.android.com/reference/android/arch/persistence/room/RoomDatabase)
  - [RoomDatabase.Builder](https://developer.android.com/reference/android/arch/persistence/room/RoomDatabase.Builder)
  - [RoomDatabase.Callback](https://developer.android.com/reference/android/arch/persistence/room/RoomDatabase.Callback)
  - [RoomDatabase.MigrationContainer](https://developer.android.com/reference/android/arch/persistence/room/RoomDatabase.MigrationContainer)
  - [RoomWarnings](https://developer.android.com/reference/android/arch/persistence/room/RoomWarnings)
  - [RxRoom](https://developer.android.com/reference/android/arch/persistence/room/RxRoom)
-

  ## Enums

  - [RoomDatabase.JournalMode](https://developer.android.com/reference/android/arch/persistence/room/RoomDatabase.JournalMode)
-

  ## Exceptions

  - [EmptyResultSetException](https://developer.android.com/reference/android/arch/persistence/room/EmptyResultSetException)