数据库事务详解

事务的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存储索引
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值