{GCP BigQuery}Multi-statement transactions

 

https://cloud.google.com/bigquery/docs/reference/standard-sql/transactions?hl=ja
https://dev.classmethod.jp/articles/bigquery-mutistatement-transaction-ga/


トランザクションは、ACID 特性を保証し、スナップショット分離をサポートします。
トランザクションの実行中、すべての読み取りはトランザクション内で参照されるテーブルについて整合性のあるスナップショットを返します。
トランザクション内のステートメントでテーブルが変更されると、同じトランザクション内の後続のステートメントにその変更内容が反映されます。

あるトランザクションでテーブル内の行が変更(更新または削除)された場合、
同じテーブル内の行を変更する他のトランザクションまたは DML ステートメントを同時に実行することはできません。
競合するトランザクションはキャンセルされます。


-- 1. 前作業

gcloud init
gcloud auth list

gcloud --version

gcloud projects create project01-9999999 \
--name="project01"

gcloud config list
gcloud config set project project01-9999999
gcloud config set compute/region asia-southeast1 --quiet
gcloud config set compute/zone asia-southeast1-a --quiet

gcloud beta billing accounts list
gcloud beta billing projects link project01-9999999 --billing-account=111111-111111-111111

gcloud services enable compute.googleapis.com --project project01-9999999

gcloud components update


-- 2. BigQuery API有効化

gcloud services list --enabled


gcloud services enable bigquery.googleapis.com \
--project project01-9999999


-- 3. BigQueryデータセットを作成する

bq mk ds01

bq ls

 

-- 4. テスト用テーブル、データの作成(コンソールから実行)

drop table ds01.tab1;

create table ds01.tab1
(
  col1 INT 
, col2 STRING
);

 

insert into ds01.tab1 values(1,'1');

select * from ds01.tab1 order by col1;

select * from ds01.INFORMATION_SCHEMA.TABLES;


-- 5. 動作確認(コンソールとターミナルから実行)

 

BEGIN TRANSACTION;
insert into ds01.tab1 values(2,'2');
select * from ds01.tab1 order by col1;
COMMIT TRANSACTION;


BEGIN TRANSACTION;
insert into ds01.tab1 values(3,'3');
select * from ds01.tab1 order by col1;
ROLLBACK TRANSACTION;

 

bq query --use_legacy_sql=false \
'select * from ds01.tab1 order by col1;'

 


-- 6. クリーンアップ


gcloud projects list

gcloud projects delete project01-9999999 \
--quiet