事务安全
事务(transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。事务通常由高级数据库操纵语言或编程语言书写的用户程序的执行所引起。事务由事务开始(begin transaction)和事务结束(end transaction)之间执行的全体操作组成。
事务基本原理
基本原理:mysql允许将事务统一进行管理(存储引擎INNODB),将用户所做的操作,暂时保存起来,不直接放到数据表(更新),等到用于确认结果之后再进行操作。
事务在mysql中通常是自动提交的,但是也可以使用手动事务。
自动事务
自动事务:autocommit(自动提交),当客户端发送一条SQL(写操作,增删改)给服务器的时候,服务器在执行之后,不用等待用户反馈结果,会自动将结果同步到数据表。
自动事务:系统做了额外的步骤来帮助用户操作。系统是通过变量来控制的。autocommit
show variables like 'autocommit%';
打开mysql客户端a,超级账号进入,设置自动提交事务关闭。(前提是innodb存储引擎命令才有效)
mysql> set autocommit = 0 ;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from student;
+----+------+
| id | name |
+----+------+
| 3 | 小艾 |
| 4 | 小新 |
| 6 | 小可 |
+----+------+
3 rows in set (0.00 sec)
mysql> insert into student values(5,'小文');
Query OK, 1 row affected (0.00 sec)
-- 这是mysql客户端a显示的表
mysql> select * from student;
+----+------+
| id | name |
+----+------+
| 3 | 小艾 |
| 4 | 小新 |
| 5 | 小文 |
| 6 | 小可 |
+----+------+
4 rows in set (0.00 sec)
mysql> commit;
Query OK, 0 rows affected (1.78 sec)
-- 改回来后,a客户端所作的任何改动,在b客户端都能及时更新。
mysql> set autocommit = 1 ;
Query OK, 0 rows affected (0.00 sec)
-- 打开mysql客户端b,超级账号进入后,同样查询该表,客户端a执行了插入操作后,查看不到了自动更新。
mysql> select * from student;
+----+------+
| id | name |
+----+------+
| 3 | 小艾 |
| 4 | 小新 |
| 6 | 小可 |
+----+------+
3 rows in set (0.00 sec)
-- commit命令提交后才能查看到更新。
mysql> select * from student;
+----+------+
| id | name |
+----+------+
| 3 | 小艾 |
| 4 | 小新 |
| 5 | 小文 |
| 6 | 小可 |
+----+------+
4 rows in set (0.00 sec)
关闭自动事务:关闭之后系统就不再帮助用户提交结果了。
set autocommit=off;
set autocommit=0;
虽然没有同步到数据表,但是当前客户端查询的时候,系统会自动根据日志表中的操作进行数据加工
一旦自动事务关闭,那么需要用户提供是否同步的命令
commit:提交(同步到数据表,事务也会被清空)
rollback:回滚(清空之前的操作,不要了)
通常我们不会关闭自动事务,这样操作太麻烦。因此只会在需要使用事务处理的时候,才会进行操作(手动事务)。