トランザクションとは?
- データの整合性を保つ方法
ロック:同時実行制御
複数ユーザーが同時に、クエリを実行してDBのデータのを書き換えると、
エラー(クラッシュ)を招く可能性があるため、ロックをかけて他のユーザーが
クエリを実行できないようにする仕組み。
実現方法
- 全てのユーザーは、クエリを実行する前に、
START TRANSACTION;
を実行する。 - 1連のクエリが実行し終わったら、
COMMIT;
を実行する。
- 全てのユーザーは、クエリを実行する前に、
try { # START TRANSACTION; # データを操作する処理 # COMMIT; } catch() { # ROLLBACK; # エラー処理(例、echo '操作を失敗しました。';) }
変更を無かったことにする方法 -> ROLLBACK;
mysql > START TRANSACTION; Query OK, 0 rows affected (0.01 sec) mysql> INSERT INTO -> departments (dept_no, dept_name) -> VALUES -> ('d010', 'strategy') -> ; Query OK, 1 row affected (0.07 sec) mysql> SELECT * FROM departments; +---------+--------------------+ | dept_no | dept_name | +---------+--------------------+ | d009 | Customer Service | | d005 | Development | | d002 | Finance | | d003 | Human Resources | | d001 | Marketing | | d004 | Production | | d006 | Quality Management | | d008 | Research | | d007 | Sales | | d010 | strategy ※追加 | +---------+--------------------+ 10 rows in set (0.00 sec) mysql> ROLLBACK; ※ <- ここで、今までの処理を無かったことにしている Query OK, 0 rows affected (0.03 sec) mysql> SELECT * FROM departments; +---------+--------------------+ | dept_no | dept_name | +---------+--------------------+ | d009 | Customer Service | | d005 | Development | | d002 | Finance | | d003 | Human Resources | | d001 | Marketing | | d004 | Production | | d006 | Quality Management | | d008 | Research | | d007 | Sales | +---------+--------------------+ 9 rows in set (0.00 sec)
変更を永続(保存)する -> COMMIT; を打つ!
mysql> START TRANSACTION; Query OK, 0 rows affected (0.00 sec) mysql> INSERT INTO -> departments (dept_no, dept_name) -> VALUES -> ('d010', 'strategy') -> ; Query OK, 1 row affected (0.01 sec) mysql> SELECT * FROM departments; +---------+--------------------+ | dept_no | dept_name | +---------+--------------------+ | d009 | Customer Service | | d005 | Development | | d002 | Finance | | d003 | Human Resources | | d001 | Marketing | | d004 | Production | | d006 | Quality Management | | d008 | Research | | d007 | Sales | | d010 | strategy ※追加 | +---------+--------------------+ 10 rows in set (0.01 sec) mysql> COMMIT; Query OK, 0 rows affected (0.04 sec) mysql> SELECT * FROM departments; +---------+--------------------+ | dept_no | dept_name | +---------+--------------------+ | d009 | Customer Service | | d005 | Development | | d002 | Finance | | d003 | Human Resources | | d001 | Marketing | | d004 | Production | | d006 | Quality Management | | d008 | Research | | d007 | Sales | | d010 | strategy ※追加 | +---------+--------------------+ 10 rows in set (0.01 sec) mysql> ROLLBACK; Query OK, 0 rows affected (0.01 sec) mysql> SELECT * FROM departments; +---------+--------------------+ | dept_no | dept_name | +---------+--------------------+ | d009 | Customer Service | | d005 | Development | | d002 | Finance | | d003 | Human Resources | | d001 | Marketing | | d004 | Production | | d006 | Quality Management | | d008 | Research | | d007 | Sales | | d010 | strategy ※追加されたまま | +---------+--------------------+ 10 rows in set (0.01 sec) mysql> DELETE FROM departments WHERE dept_no = 'd010'; Query OK, 1 row affected (0.05 sec) mysql> SELECT * FROM departments; +---------+--------------------+ | dept_no | dept_name | +---------+--------------------+ | d009 | Customer Service | | d005 | Development | | d002 | Finance | | d003 | Human Resources | | d001 | Marketing | | d004 | Production | | d006 | Quality Management | | d008 | Research | | d007 | Sales | +---------+--------------------+ 9 rows in set (0.00 sec)