SQLトランザクションとは
複数の SQL 文によるデータ更新を1つの処理としてまとめてデータベースに反映させることです。
トランザクションブロック
BEGIN TRANSACTION;
-- Code
END TRANSACTION;
BEGIN;
-- Code
COMMIT;
トランザクションの実際の動き(普通の動き)
-
トランザクションでcommitしないと、DBに反映されない
-
Tab1
BEGIN TRANSACTION;
INSERT INTO public.companies (
uuid, name
) VALUES
('test_com')
;
- Tab2
SELECT * FROM public.companies
- Tab1
COMMIT;
- Tab2
SELECT * FROM public.companies
トランザクションの実際の動き(同時に追加 / uuidしてしない)
- Tab1
BEGIN TRANSACTION;
INSERT INTO public.companies (
uuid, name
) VALUES
('test_com')
;
SELECT * FROM public.companies;
- Tab2
BEGIN TRANSACTION;
INSERT INTO public.companies (
name
) VALUES
('test_com2')
;
SELECT * FROM public.companies;
- Tab1
COMMIT;
- Tab2
COMMIT;
SELECT * FROM public.companies
トランザクションの実際の動き(同時に追加 / プライマリーuuid指定する)
- Tab1
BEGIN TRANSACTION;
INSERT INTO public.companies (
uuid, name
) VALUES
('33333333-3333-3333-3333-333333333334','重複com')
ON CONFLICT DO NOTHING
;
SELECT * FROM public.companies;
- Tab2
BEGIN TRANSACTION;
INSERT INTO public.companies (
uuid, name
) VALUES
('33333333-3333-3333-3333-333333333334','重複com')
ON CONFLICT DO NOTHING
;
SELECT * FROM public.companies;
- Tab1
COMMIT;
- Tab2
COMMIT;
ストプロ注意
- ストプロ準備
DROP TYPE IF EXISTS type_create_campaign CASCADE;
CREATE TYPE type_create_campaign AS (
company_uuid UUID
);
CREATE OR REPLACE FUNCTION create_campaign(
p_company_uuid UUID
,p_name TEXT
) RETURNS SETOF type_create_campaign AS $FUNCTION$
DECLARE
BEGIN
--チェックキャンペーン存在
PERFORM 1 FROM public.campaigns
WHERE
name = p_name
AND
company_uuid = p_company_uuid
;
IF FOUND THEN
RAISE SQLSTATE 'U0003' USING MESSAGE = 'campaign name has exist';
END IF;
-- キャンペーン追加
INSERT INTO public.campaigns (
company_uuid, name
) VALUES
(p_company_uuid,p_name)
ON CONFLICT DO NOTHING
;
RETURN QUERY SELECT p_company_uuid;
END;
$FUNCTION$ LANGUAGE plpgsql;
試す1
BEGIN TRANSACTION;
SELECT * FROM create_campaign(
p_company_uuid := '33333333-3333-3333-3333-333333333333',
p_name := 'com_3_cp_3'
);
SELECT * FROM create_campaign(
p_company_uuid := '33333333-3333-3333-3333-333333333333',
p_name := 'com_3_cp_3'
);
COMMIT;
試す2
-- Tab1
BEGIN TRANSACTION;
SELECT * FROM create_campaign(
p_company_uuid := '44444444-4444-4444-4444-444444444444',
p_name := 'com_4_cp_4'
);
-- Tab2
BEGIN TRANSACTION;
SELECT * FROM create_campaign(
p_company_uuid := '44444444-4444-4444-4444-444444444444',
p_name := 'com_4_cp_4'
);
-- Step2
-- Tab1
COMMIT;
-- 結果を見る
-- Tab2
COMMIT;
-- 結果を見る