事务的ACDI性质
1、原子性
事务作为一个整体被执行,包含在其中的对数据库的操作要么全部被执行,要么都不执行
2、一致性
事务应确保数据库的状态从一个一致状态转变为另一个一致状态。一致状态的含义是数据库中的数据应满足完整性约束
3、隔离性
多个事务并发执行时,一个事务的执行不应影响其他事务的执行
4,、持久性
已被提交的事务对数据库的修改应该永久保存在数据库中
Mysql如何实现事务
(1)存储引擎 :存储引擎有MyIsam(Mysql默认)和 InnoDB 。其中MyIsam它不支持事务,而InnoDB支持事务,所以需要先将存储引擎更改InnoDB
(2)开启事务
(3)输入组成事务sql语句
<1> 设置一个保存点 <2>设置一个保存点 <3>设置一个保存点 <4>
(4)sql语句执行失败通过rollback 退回到最初状态即文件里状态,也可以通过rollback to 保存点来退回到保存点之前的状态
(5)commit 组成事务的所有sql语句都执行成功后调用commit ,真正提交给
文件,此时不能再进行rollback
三种修改存储引擎方式:
1.建表的时候直接设置自己需要的引擎,如下所示:
CREATE TABLE user_myi
(
id
int(11) DEFAULT NULL,
name
varchar(10) CHARACTER SET utf8 DEFAULT NULL,
password
varchar(10) DEFAULT NULL
) ENGINE=MyIsam;
2.后续通过sql语句进行修改
alter table user_myi engine=InnoDB;
3.在配置文件里直接修改,创建新表时默认设置为修改后的引擎
default-storage-engine=InnoDB
此时一定要重启重启mysql服务
如何开启一个事务:
我们可以通过select @@Autocommit语句来查看提交的方式,提交方式有两种,分别是 默认自动提交和执行commit来写入文件里 。(所有的sql操作都是直接对文件进行修改的)
我们来执行select @@Autocommit;可以得到下面这样的结果,1表示这里的提交方式是自动提交的
+--------------+
| @@Autocommit |
+--------------+
| 1 |
+--------------+
可以通过set @@Autocommit=0; 来关闭自动提交,直到所有sql语句全部执行成功后,手动调用commit再来写入文件里,具体操作如下所示:
mysql> set @@Autocommit=0;
Query OK, 0 rows affected (0.02 sec)(这里表示sql语句执行成功)
mysql> select @@Autocommit;
+--------------+
| @@Autocommit |
+--------------+
| 0 |
+--------------+(可以看到已经修改为了手动提交)
begin;
<1><2><3>(这里代表三条sql语句)
其中一条sql语句执行失败之后,需要通过rollback来表里的信息退回到最初的状态,也可以通过设置保存点来使它回到指定的步骤,保存点的设置可以参考下面来进行设置
新插入两条数据,保存前使用rollback来进行回滚操作,再查看表中的信息:
savepoint point1;
insert into user values(4,'tom','hjm');
Query OK, 1 row affected (0.00 sec)
mysql> insert into user values(5,'jim','gfm');
Query OK, 1 row affected (0.00 sec)
mysql> select * from user;
+------+----------+----------+
| id | name | password |
+------+----------+----------+
| 1 | zhangSan | 123456 |
| 2 | 李四 | 789 |
| 3 | 王五 | NULL |
| 4 | tom | hjm |
| 5 | jim | gfm |
+------+----------+----------+
5 rows in set (0.00 sec)
mysql> rollback;
Query OK, 0 rows affected (0.01 sec)
mysql> select * from user;
+------+----------+----------+
| id | name | password |
+------+----------+----------+
| 1 | zhangSan | 123456 |
| 2 | 李四 | 789 |
| 3 | 王五 | NULL |
+------+----------+----------+
设置保存点,当sql语句出错时进行回滚操作
mysql> savepoint point1;
Query OK, 0 rows affected (0.01 sec)
mysql> insert into user values(6,'jack','ds213');
Query OK, 1 row affected (0.00 sec)
mysql> select * from user;
+------+----------+----------+
| id | name | password |
+------+----------+----------+
| 1 | zhangSan | 123456 |
| 2 | 李四 | 789 |
| 3 | 王五 | NULL |
| 4 | tom | hjm |
| 5 | jim | gfm |
| 6 | jack | ds213 |
+------+----------+----------+
6 rows in set (0.00 sec)
mysql> insert into user valuesddsad();
ERROR 1064 (42000): You have an error in your SQL syntax;
check the manual that corresponds to your MySQL serve
r version for the right syntax to use near 'valuesddsad()' at line 1
mysql> rollback to point1; //退回到某一个保存点
Query OK, 0 rows affected (0.00 sec)
mysql> select * from user;
+------+----------+----------+
| id | name | password |
+------+----------+----------+
| 1 | zhangSan | 123456 |
| 2 | 李四 | 789 |
| 3 | 王五 | NULL |
| 4 | tom | hjm |
| 5 | jim | gfm |
+------+----------+----------+
5 rows in set (0.00 sec)
需要注意的是一旦使用commit语句进行保存后无法进行回滚操作 ,如下:
mysql> insert into user values(4,'tom','hjm');
Query OK, 1 row affected (0.01 sec)
mysql> insert into user values(5,'jim','gfm');
Query OK, 1 row affected (0.00 sec)
mysql> insert into user values(5,'jim','gfm');
Query OK, 1 row affected (0.00 sec)
mysql> select * from user;
+------+----------+----------+
| id | name | password |
+------+----------+----------+
| 1 | zhangSan | 123456 |
| 2 | 李四 | 789 |
| 3 | 王五 | NULL |
| 4 | tom | hjm |
| 5 | jim | gfm |
| 5 | jim | gfm |
+------+----------+----------+
6 rows in set (0.00 sec)
mysql> commit; //写入到文件当中
Query OK, 0 rows affected (0.01 sec)
mysql> select * from user;
+------+----------+----------+
| id | name | password |
+------+----------+----------+
| 1 | zhangSan | 123456 |
| 2 | 李四 | 789 |
| 3 | 王五 | NULL |
| 4 | tom | hjm |
| 5 | jim | gfm |
| 5 | jim | gfm |
+------+----------+----------+
6 rows in set (0.01 sec)
mysql> rollback;
Query OK, 0 rows affected (0.00 sec)
(即使这里提示操作成功也无法进行回滚操作!)
mysql> select * from user;
+------+----------+----------+
| id | name | password |
+------+----------+----------+
| 1 | zhangSan | 123456 |
| 2 | 李四 | 789 |
| 3 | 王五 | NULL |
| 4 | tom | hjm |
| 5 | jim | gfm |
| 5 | jim | gfm |
+------+----------+----------+
mysql 怎么存储数据
在mysql/data(目录可能不同)目录下可以找到以.frm .ibd .myd .myi的文件,其中:
InnoDB 引擎:
- .frm 存储表的结构
- .ibd 存储索引和数据
MyIsam:
- .frm 存储表的结构
- .myd 存储数据
- .myi存储索引