文章目录
mysql事务
一、事务的概念
- 是一种机制、一个操作序列,包含了一组数据库操作命令,并且把所有的命令作为一个整体一起向系统提交或撤销操作请求,即这一组数据库命令要么都执行,要么都不执行.
- 是一个不可分割的工作逻辑单元,在数据库系统,上执行并发操作时,事务是最小的控制单元
- 适用于多用户同时操作的数据库系统的场景,如银行、保险公司及证券交易系统等等.
- 通过事务的整体性以保证数据的一致性.
二、事务的ACID特点
- 原子性(Atomicity)
- 事务是一个完整的操作,事务的各元素是不可分的
- 事务中的所有元素必须作为一个整体提交或回滚
- 如果事务中的任何元素失败,则整个事务将失败
- 一致性(Consistency)
- 当事务完成时,数据必须处于一 致状态
- 在事务开始前,数据库中存储的数据处于一致状态
- 在正在进行的事务中,数据可能处于不一致的状态
- 当事务成功完成时,数据必须再次回到已知的一致状态
- 隔离性(Isolation)
- 对数据进行修改的所有并发事务是彼此隔离的,表明事务必须是独立的,它不应以任何方式依赖于或影响其他事务
- 修改数据的事务可在另-一个使用相同数据的事务开始之前访问这些数据,或者在另一个使用相同数据的事务结束之后访问这些数据
- 持久性(Durability)
- 指不管系统是否发生故障,事务处理的结果都是永久的
- 一旦事务被提交,事务的效果会被永久地保留在数据库中
三、事务控制语句
- MySQL事务默认是自动提交的,当SQL 语句提交时事务便自动提交
- 事务控制语句
begin或start transaction 开始一个事务
commit 提交一个事务
rollback 回滚一个事务
savepoint identifier 设置断点,存档点
release savepoint identifier删除存档点 identifier(存档点名称)
rollback to identifier 回到存档点
set transaction 设置事务
四、事务的控制方法
- 手动对事务进行控制的方法
事务处理命令控制事务
bebin: 开始一个事务
commit: 提交一个事务
rollback: 回滚一个事务 - 使用set命令进行控制
set autocommit=0: 禁止自动提交.(等同于begin)
set autocommit=1: 开启自动提交. (等同于commit)
五、事务的操作
5.1事务处理命令控制事务(1)
存储引擎必须是innoadb;只有innoadb才支持事务
创建数据表
mysql> create table shiwu (id int(5) not null primary key auto_increment,name char(10) not null, score decimal(5,2), address varchar(20) not null default'未知')engine=innodb;
Query OK, 0 rows affected (0.01 sec)
mysql> show tables;
+------------------+
| Tables_in_school |
+------------------+
| info |
| num |
| shiwu |
| tmp |
+------------------+
5.2事务处理命令控制事务(2)
开始事务
mysql> begin;
Query OK, 0 rows affected (0.00 sec)
mysql> insert into shiwu (name,score,address) values ( 'zhangsan',80,'nanjing');
Query OK, 1 row affected (0.01 sec)
mysql> commit; 提交
Query OK, 0 rows affected (0.00 sec)
mysql> select*from shiwu;
+----+----------+-------+---------+
| id | name | score | address |
+----+----------+-------+---------+
| 1 | zhangsan | 80.00 | nanjing |
+----+----------+-------+---------+
1 row in set (0.00 sec)
5.3事务处理命令控制事务(3)
rollback回滚会返回到开始数据状态
mysql> begin;
Query OK, 0 rows affected (0.00 sec)
mysql> insert into shiwu (name,score,address) values ( 'lisi',90,'beijing');
Query OK, 1 row affected (0.01 sec)
mysql> rollback;
Query OK, 0 rows affected (0.00 sec)
mysql> select *from shiwu;
+----+----------+-------+---------+
| id | name | score | address |
+----+----------+-------+---------+
| 1 | zhangsan | 80.00 | nanjing |
+----+----------+-------+---------+
1 row in set (0.00 sec)
5.4事务处理命令控制事务(4)
savepoint a;相当于克隆
mysql> insert into shiwu (name,score,address) values ( 'zhangwu',75,'jurongng');
Query OK, 1 row affected (0.00 sec)
mysql> savepoint a;
Query OK, 0 rows affected (0.00 sec)
mysql> insert into shiwu (name,score,address) values ( 'zhang',75,'lishui');
Query OK, 1 row affected (0.00 sec)
mysql> savepoint b;
Query OK, 0 rows affected (0.00 sec)
mysql> select*from shiwu;
+----+-----------+-------+-----------+
| id | name | score | address |
+----+-----------+-------+-----------+
| 1 | zhangsan | 80.00 | nanjing |
| 3 | lisi | 90.00 | beijing |
| 4 | wangwu | 95.00 | shanghai |
| 5 | wangwuhan | 85.00 | wuhan |
| 6 | zhangfeng | 85.00 | wutaishan |
| 7 | zhangwu | 75.00 | jurong |
| 8 | zhang | 75.00 | lishui |
+----+-----------+-------+-----------+
7 rows in set (0.00 sec)
mysql> rollback to a;
Query OK, 0 rows affected (0.01 sec)
mysql> select*from shiwu;
+----+-----------+-------+-----------+
| id | name | score | address |
+----+-----------+-------+-----------+
| 1 | zhangsan | 80.00 | nanjing |
| 3 | lisi | 90.00 | beijing |
| 4 | wangwu | 95.00 | shanghai |
| 5 | wangwuhan | 85.00 | wuhan |
| 6 | zhangfeng | 85.00 | wutaishan |
| 7 | zhangwu | 75.00 | jurong |
+----+-----------+-------+-----------+
5.5总结
三种情况结束事务
commit;
set autocommit=1;
rollback;
三种情况开始事务
begin;
START TRANSACTION;
set autocommit=0
默认存储引擎innodb 前提条件
-----±------±----------+
#### 5.5总结
三种情况结束事务
commit;
set autocommit=1;
rollback;
三种情况开始事务
begin;
START TRANSACTION;
set autocommit=0
默认存储引擎innodb 前提条件
##