Marks a method in a Dao class as a transaction method.
When used on a non-abstract method of an abstract 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.
>> 将Dao类中的方法标记为事务方法。
当用于抽象Dao类的非抽象方法时,该方法的派生实现将在数据库事务中执行super方法。 所有参数和返回类型均被保留。 除非在方法主体中引发异常,否则事务将被标记为成功。
@Transaction
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);
}
}
当在具有Select语句的Query方法上使用时,可以为Query生成的代码将在事务中运行:(两种情况)
1. 如果查询的结果相当大,则需要在事务内运行它以接收一致的结果。
2. 如果查询的结果是带有“Relation”的字段,则分别查询这些字段。为了在这些查询之间获得一致的结果,我们需要在单个事务中运行它们。
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();
}
备注:
1. 如果查询是异步查询(例如返回LiveData或RxJava Flowable),在运行查询时(而不是在调用方法时)将需要添加@Transaction。
2. 将此注释放在Insert,Update或Delete方法上没有影响,因为它们始终在事务内运行。同样,如果用Query注释但运行了update或delete语句,则它将自动包装在事务中。