前言
什么是事务?
所谓事务就是可以将几个操作组成一个单元,要么操作全部执行成功,要么哪个操作出了问题,就全部不成功。
以下是事务的4大特性:
- 原子性(Atomicity)
事务是数据库的逻辑工作单位,事务中包括的诸操作要么全做,要么全不做。
- 一致性(Consistency)
事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。 - 隔离性(Isolation)
一个事务的执行不能被其他事务干扰。 - 持续性/永久性(Durability)
一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。
ObjectBox 支持事务操作!
在你读写数据的时候,ObjectBox 以事务的方式来处理这些操作。
比如:
写数据:put
的时候,写的事务被执行。
读数据:get
的时候,读的事务被执行。
事务的开销
注意!
一个完整的事务执行时需要花费一些时间的。
一个事务的提交,会将当前内存中的数据信息,写入到磁盘,等所有的数据写入到磁盘,文件系统确认所有的数据写入无误后,这个事务才算是成功的。所以在进行磁盘相关的操作的时候,是非常花费时间的。
一次事务操作的时间开销
现在问题来了:
将一个对象写入到数据库就需要耗费15毫秒,那写入100个对象就要15*100个毫秒,那效率岂不是太差啦!
100次事务操作的时间开销
解决办法:
用一个事务的执行来一下子将100个对象写入到数据库。
一次事务的操作将100个对象写入到磁盘
ObjectBox的
put
有如下几种调用方式:put
你可以将一个对象或是多个对象传给
put
,调用一次put
,就是一次完整的事务执行,很方便!
读取数据相关的事务
在ObjectBox中,读事务相对来说开销比较小(它不需要将数据写入到磁盘),所以,当你使用get
方法的时候,你不需要过多的顾虑开销的问题。
但是,毕竟它也是从磁盘里面读取数据的,当你要频繁的读取大量的数据的时候,考虑将这些操作放入到一个事务里面!
明确的控制事务的执行
当我们简单的进行少数put get
的时候,这时候我们没必要去考虑指定一个事务的什么开始,什么时候去提交。
但是,当我们有多个put get
的时候,或者这一堆操作需要共生死,共存亡的时候,我们可以考虑将这些操作放入到一个事务中去执行,以此来提高执行的效率与安全。
BoxStore提供了如下方法来控制事务的执行:
- runInTx: 在一个事务中执行runnable
- runInReadTx: 在读事务中执行runnable, 不像写事务,它可以在同一个时间,执行多个读事务(并发执行)
- runInTxAsync:在独立的一个线程中,执行一个事务。当事务执行完毕后,会产生一个回调
- callInTx: 跟runInTx差不多,但是它允许你返回一个数值,或是异常。