---
metadata:
  - name: generator
    content: Diplodoc Platform v5.50.6
alternate:
  - https://ytsaurus.tech/docs/en/user-guide/data-processing/spyt/read-transaction.md
  - https://ytsaurus.tech/docs/ru/user-guide/data-processing/spyt/read-transaction.md
---
> **Documentation Index:** Fetch the complete configuration index at https://ytsaurus.tech/docs/ru/llms.txt

<!-- source: ru/_includes/user-guide/data-processing/spyt/read-transaction.md -->
# Чтение и запись под транзакцией


Подробнее о транзакциях можно узнать в разделе [Транзакции](https://ytsaurus.tech/docs/ru/user-guide/dynamic-tables/transactions.md).


По умолчанию Spark не создает транзакций на чтение и не берет никаких блокировок. Чтобы обеспечить консистентность чтения для изменяющихся таблиц, можно создавать транзакцию самостоятельно и перенаправлять её в чтение датафрейма Spark.

Пример на Python:

```python
with yt.Transaction() as tr:
    df = spark.read.option("transaction", tr.transaction_id).yt("//sys/spark/examples/example_1")
    df.show()
```

В момент вызова `spark.read.yt` берётся блокировка на таблицу (snapshot lock), то есть во время составления плана и до начала физического чтения. В приведённом примере два вызова `show()` будут дважды читать таблицу, но обязательно вернут один и тот же результат:

```python
with yt.Transaction() as tr:
    df = spark.read.option("transaction", tr.transaction_id).yt("//sys/spark/examples/example_1")
    df.show()
    time.sleep(60)
    df.show()
```

{% note info "Примечание" %}

Можно включить создание глобальной транзакции, которая открывается в начале сессии Spark и держится всё время работы джоба. При использовании глобальной транзакции необходимо учесть что джоб будет брать блокировки на все таблицы, которые читает, и будет продолжать держать их до завершения. Использование глобальной транзакции включается параметром конфигурации `spark.yt.globalTransaction.enabled=true`.

{% endnote %}

В случае необходимости записи в таблицу под транзакцией нужно использовать опцию `write_transaction` при сохранении датафрейма:

```python
df.write.option('write_transaction', transaction_id).yt("//target/table/path")
```
<!-- endsource: ru/_includes/user-guide/data-processing/spyt/read-transaction.md -->
