重要なポイント
解説
トランザクションとは、複数の処理や操作を一連作業の単位にまとめたものです。
下記の図を例に、商品購入処理で考えてみると「①購入情報登録処理」と「②在庫数変更処理」の2つを行うことが「トランザクション処理」となります。
下記の図のように「①購入情報登録処理」は処理済みで成功したが、「②在庫数変更処理」でエラー発生し失敗した場合、データ不整合が起こってしまいます。この場合、在庫数が合わないという「データ不整合」が発生してしまいます。
下記の図のように「①購入情報登録処理」は処理済みで成功したが、「②在庫数変更処理」でエラー発生し失敗した場合には、処理開始前のデータに戻すという処理があります。そのことを「ロールバック」といいます。
下記の図のように「①購入情報登録処理」は処理済みで成功、「②在庫数変更処理」は処理済みで成功の場合には、処理を確定することができます。そのことを「コミット」といいます。
構文
rollback(ロールバック)
begin;
[処理1];
[処理2];
[処理3];
rollback;
<例題>
- トランザクション処理を実行すること。
- 「students_mst」テーブルに値を登録すること。
- ロールバック(rollback)し、データ登録前に戻すこと。
student_id | 1000 |
student_name | 井田 テスト |
student_name_kana | イダ テスト |
student_number | 21000000 |
department_id | 1 |
gender | 0 |
age | 20 |
test_score | 100 |
insert_at | now() |
update_at | now() |
--トランザクション処理開始
begin;
--処理1
insert into students_mst(
student_id
,student_name
,student_name_kana
,student_number
,department_id
,gender
,age
,test_score
,insert_at
,update_at
) values (
1000
,'井田 テスト'
,'イダ テスト'
,'21000000'
,1
,'0'
,20
,100
,now()
,now()
);
--ロールバック前の結果
select * from students_mst sm;
--ロールバック
rollback;
--ロールバック後の結果
select * from students_mst sm;
commit(コミット)
begin;
[処理1];
[処理2];
[処理3];
commit;
<例題>
- トランザクション処理を実行すること。
- 「students_mst」テーブルに値を登録すること。
- コミット(commit)し、データ登録を確定すること。
student_id | 1000 |
student_name | 井田 テスト |
student_name_kana | イダ テスト |
student_number | 21000000 |
department_id | 1 |
gender | 0 |
age | 20 |
test_score | 100 |
insert_at | now() |
update_at | now() |
--トランザクション処理開始
begin;
--処理1
insert into students_mst(
student_id
,student_name
,student_name_kana
,student_number
,department_id
,gender
,age
,test_score
,insert_at
,update_at
) values (
1000
,'井田 テスト'
,'イダ テスト'
,'21000000'
,1
,'0'
,20
,100
,now()
,now()
);
--ロールバック前の結果
select * from students_mst sm;
--ロールバック
commit;
--ロールバック後の結果
select * from students_mst sm;
MySQLでの注意点
MySQL(mariaDB)を利用してのトランザクション処理を実行するためには、テーブルごとの「ストレージエンジン(strage engine)」の設定が重要となります。
今回は、一般的に利用されている(初期データベースエンジンである)「InnoDB」エンジンを利用します。下記の方法で、エンジンを調べてみましょう。
万が一、「InnoDB」エンジンではない場合には、再度テーブルを作り直す、もしくは、エンジン変更する場合があります。
SHOW TABLE STATUS where name = '[テーブル名]' \G;
<例題>
- 学生マスタ(students_mst)のテーブルエンジンを調べること。
SHOW TABLE STATUS where name = 'students_mst' \G;
<ワンポイント>
上記のように末尾に「\G」を付けると縦表示に変更になります。テーブル設定情報などを表示させる場合には、こちらを方が見やすい場合があります。※Gは、半角大文字です。