重要なポイント
解説
トランザクションとは、複数の処理や操作を一連作業の単位にまとめたものです。
下記の図を例に、商品購入処理で考えてみると「①購入情報登録処理」と「②在庫数変更処理」の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は、半角大文字です。