# Read-only transactions

**URL:** <https://forums.foundationdb.org/t/read-only-transactions/3412>\
**Category:** Using FoundationDB\
**Created:** [June 30, 2022, 4:32pm UTC](https://forums.foundationdb.org/t/read-only-transactions/3412 "2022-06-30T16:32:48Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![doublemax](https://avatars.discourse-cdn.com/v4/letter/d/8e7dd6/32.png) [@doublemax](https://forums.foundationdb.org/u/doublemax)\
**Post date:** [June 30, 2022, 4:32pm UTC](https://forums.foundationdb.org/t/read-only-transactions/3412/1 "2022-06-30T16:32:48Z")

</div>

This article ([FoundationDB: A Distributed Unbundled Transactional Key Value Store (Sigmod 2021)](http://muratbuffalo.blogspot.com/2022/03/foundationdb-distributed-unbundled.html)) claims:

> In addition to the above read-write transactions, FDB also supports read-only transactions and snapshot reads.

Question: How to create a read-only transaction (using C API)?

---

<div class="post-metadata">

**Author:** ![markus.pilman](https://sea1.discourse-cdn.com/foundationdb/user_avatar/forums.foundationdb.org/markus.pilman/32/379_2.png) [@markus.pilman](https://forums.foundationdb.org/u/markus.pilman)\
**Post date:** [July 1, 2022, 2:38pm UTC](https://forums.foundationdb.org/t/read-only-transactions/3412/2 "2022-07-01T14:38:06Z")

</div>

> [@doublemax](#):
>
> How to create a read-only transaction (using C API)?

You never write anything and you don’t call `fdb_transaction_commit` 🙂. There’s really nothing special here, read transactions are not differently started than write transactions.

Snapshot reads are a bit different as they change the conflict resolution of a transaction. Basically, they allow you to disable read-write conflict resolution for some of your reads. For a read-only transaction doing snapshot reads doesn’t have any effects. This is documented [here](https://apple.github.io/foundationdb/api-c.html#snapshot-reads).

---

<div class="post-metadata">

**Author:** ![doublemax](https://avatars.discourse-cdn.com/v4/letter/d/8e7dd6/32.png) [@doublemax](https://forums.foundationdb.org/u/doublemax)\
**Post date:** [July 1, 2022, 2:51pm UTC](https://forums.foundationdb.org/t/read-only-transactions/3412/3 "2022-07-01T14:51:12Z")

</div>

Thanks for your explanation!

---

<div class="post-metadata">

**Author:** ![Imperatorx](https://avatars.discourse-cdn.com/v4/letter/i/d2c977/32.png) [@Imperatorx](https://forums.foundationdb.org/u/Imperatorx)\
**Post date:** [July 3, 2022, 12:05am UTC](https://forums.foundationdb.org/t/read-only-transactions/3412/4 "2022-07-03T00:05:58Z")

</div>

@markus.pilman is the “don’t call commit” part really needed? I’ve tried some read transactions in a hot loop and committing:

```auto
public static void main(String[] args) {
        FDB fdb = FDB.selectAPIVersion(710);
        var db = fdb.open();
        while(true) {
            var tr = db.createTransaction();
            tr.get("foo".getBytes()).join();
            tr.commit();
            tr.close();
        }
    }

```

```auto
Workload:
  Read rate - 760 Hz
  Write rate - 0 Hz
  Transactions started - 746 Hz
  Transactions committed - 1 Hz
  Conflict rate - 0 Hz

```

So even if I commit, the server cluster receives no commits. Is this optimized on the client side? We use Java annotation based declarative transactions, so we always commit even in read only situations, can we continue to do so relying on this optimization?

---

<div class="post-metadata">

**Author:** ![markus.pilman](https://sea1.discourse-cdn.com/foundationdb/user_avatar/forums.foundationdb.org/markus.pilman/32/379_2.png) [@markus.pilman](https://forums.foundationdb.org/u/markus.pilman)\
**Post date:** [July 3, 2022, 1:46am UTC](https://forums.foundationdb.org/t/read-only-transactions/3412/5 "2022-07-03T01:46:03Z")

</div>

Yes, this is a client side optimization. You can still call commit, it will be a no-op.
