重要なポイント

一連の処理の中でエラーが発生したかどうかで動作が変わる?!

解説

トランザクションとは、複数の処理や操作を一連作業の単位にまとめたものです。

下記の図を例に、商品購入処理で考えてみると「①購入情報登録処理」と「②在庫数変更処理」の2つを行うことが「トランザクション処理」となります。


 

下記の図のように「①購入情報登録処理」は処理済みで成功したが、「②在庫数変更処理」でエラー発生し失敗した場合、データ不整合が起こってしまいます。この場合、在庫数が合わないという「データ不整合」が発生してしまいます。


 

下記の図のように「①購入情報登録処理」は処理済みで成功したが、「②在庫数変更処理」でエラー発生し失敗した場合には、処理開始前のデータに戻すという処理があります。そのことを「ロールバック」といいます。


 

下記の図のように「①購入情報登録処理」は処理済みで成功、「②在庫数変更処理」は処理済みで成功の場合には、処理を確定することができます。そのことを「コミット」といいます。

構文

rollback(ロールバック)

begin;
[処理1];
[処理2];
[処理3];
rollback;

<例題>

  • トランザクション処理を実行すること。
  • 「stundent_mst」テーブルに値を登録すること。
  • ロールバック(rollback)し、データ登録前に戻すこと。
student_no 1000
student_kj 井田 テスト
student_kn イダ テスト
student_cd 21000000
gakka_no 1
seibetu_ku 0
age_nb 20
test_su 100
delete_ku 0
insert_at now()
update_at now()
--トランザクション処理開始
begin;

--処理1
insert into student_mst(
student_no
,student_kj
,student_kn
,student_cd
,gakka_no
,seibetu_ku
,age_nb
,test_su
,delete_ku
,insert_at
,update_at
) values (
1000
,'井田 テスト'
,'イダ テスト'
,'21000000'
,1
,'0'
,20
,100
,'0'
,now()
,now()
);

--ロールバック前の結果
select * from student_mst sm;

--ロールバック
rollback;

--ロールバック後の結果
select * from student_mst sm;

commit(コミット)

begin;
[処理1];
[処理2];
[処理3];
commit;

<例題>

  • トランザクション処理を実行すること。
  • 「stundent_mst」テーブルに値を登録すること。
  • コミット(commit)し、データ登録を確定すること。
student_no 1000
student_kj 井田 テスト
student_kn イダ テスト
student_cd 21000000
gakka_no 1
seibetu_ku 0
age_nb 20
test_su 100
delete_ku 0
insert_at now()
update_at now()
--トランザクション処理開始
begin;

--処理1
insert into student_mst(
student_no
,student_kj
,student_kn
,student_cd
,gakka_no
,seibetu_ku
,age_nb
,test_su
,delete_ku
,insert_at
,update_at
) values (
1000
,'井田 テスト'
,'イダ テスト'
,'21000000'
,1
,'0'
,20
,100
,'0'
,now()
,now()
);

--ロールバック前の結果
select * from student_mst sm;

--ロールバック
commit;

--ロールバック後の結果
select * from student_mst sm;

MySQLでの注意点

MySQL(mariaDB)を利用してのトランザクション処理を実行するためには、テーブルごとの「ストレージエンジン(strage engine)」の設定が重要となります。

今回は、一般的に利用されている(初期データベースエンジンである)「InnoDB」エンジンを利用します。下記の方法で、エンジンを調べてみましょう。

万が一、「InnoDB」エンジンではない場合には、再度テーブルを作り直す、もしくは、エンジン変更する場合があります。

SHOW TABLE STATUS where name = '[テーブル名]' \G;
<例題>
  • 学生マスタ(student_mst)のテーブルエンジンを調べること。
SHOW TABLE STATUS where name = 'student_mst' \G;
<ワンポイント>
上記のように末尾に「\G」を付けると縦表示に変更になります。テーブル設定情報などを表示させる場合には、こちらを方が見やすい場合があります。※Gは、半角大文字です。