1.什么是事务
1)事务是指执行一批操作,要么操作全部成功,要么全部失败,不会存在极个别失败或成功的现象;
2)事务是一个原子性操作,是最小单元,可由一个或多个SQL语句组成;
2.事务特性
1)原子性:事务是一个原子性质的操作单元,事务里面对数据库的操作要么全部执行,要么全部不执行;
2)一致性:事务操作之前和之后,数据都必须保持一致,保证数据的完整性;
3)隔离性:事务的操作不能被其它事务干扰,即一个事务的内部操作及使用的数据对其它并发事务时时隔离的,并发执行的各个事务之间不能互相干扰;
4)持久性:事务一旦提交,对数据库的改变将是永久的。
3、MySQL之事务操作
MySQL默认事务操作是隐式事务,执行增删改操作时,数据库自动开启事务,提交或回滚事务;是否开启隐式事务是由autocommit控制的,事务分为隐式事务、显式事务,savepoint(保存点)和只读事务;
3.1.隐式事务
可查看autocommit是否开启了自动提交:
show variables like 'autocommit';
注:autocommit为ON表示开启了自动提交,OFF表示手动提交
3.2.显式事务
显式事务需要开发者手动开启;提交、回滚由开发者自己控制。
开启事务:
set autocommit=0;
开启显式事务后,操作数据后需要手动提交或回滚
3.3.保存点 savepoint
当我们需要只回滚一部分数据的时候,可以用savepoint
在要保存的地方写:point1是保存点名称
save point1;
需要回滚时:
rollback to point1;
commit;
此操作将会把savepoint和rollback to point1之间的操作全部回滚
案例:
创表,可以在终端,也可以在MySQL对应的软件里面,如:Navicat Premium
mysql> create table t_test (id int);
Query OK, 0 rows affected (0.01 sec)
mysql> select * from t_test;
Empty set (0.00 sec)
mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)
mysql> insert into t_test values (1);
Query OK, 1 row affected (0.00 sec)
mysql> savepoint point1;
Query OK, 0 rows affected (0.00 sec)
mysql> insert into t_test values (2);
Query OK, 1 row affected (0.00 sec)
mysql> rollback to point1;
Query OK, 0 rows affected (0.00 sec)
mysql> commit;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from t_test;
+------+
| id |
+------+
| 1 |
+------+
1 row in set (0.00 sec)
我在增加1之后设置了一个保存点,然后再增加2回滚,提交后查询只查到了1,说明保存点后面的操作全被回滚了。
3.4.只读事务
表示事务只会做一些只读操作,如查询,而不会增删改操作;
开启只读事务:
start transaction read only;
案例:
mysql> start transaction read only;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from t_test;
+------+
| id |
+------+
| 1 |
| 1 |
+------+
2 rows in set (0.00 sec)
mysql> delete from t_test;
ERROR 1792 (25006): Cannot execute statement in a READ ONLY transaction.
mysql> commit;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from t_test;
+------+
| id |
+------+
| 1 |
| 1 |
+------+
2 rows in set (0.00 sec)
可以发现,只能查询,删除操作会报错,增,改也依然;