0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

SQL のトランザクションについて

Posted at
1 / 6

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;
-- 結果を見る

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?