Mysql事务的个人理解

#### Mysql事务的个人理解

研究CRMEB多商户的时候看到事务,对于事务个人的理解记录一下;

点击 [源码](http://github.crmeb.net/u/meng) 了解[CRMEB多商户](http://github.crmeb.net/u/xian),账号 demo 密码 crmeb.com

其他 [开源项目](http://github.crmeb.net/u/lanlan) 源码下 :[了解更多](http://github.crmeb.net/u/lanlan)

小姐姐二维码

![在这里插入图片描述](https://img-blog.csdnimg.cn/2021041011043430.png)

 

 

. 什么是事务。

    

1. 知道事务,要先了解mysql的引擎,在5.5版本以前mysql的引擎默认是MyISAM,到了Mysql5.5版本以后,才有了InnoDB,两者的区别之一就是InnoDB支持事务。

2. 事务就是进行一次处理的基本单元,要么完全执行,要么都不执行。

 

. 事务的特性(ACID)。

 

1. A,也就是原子性(Atomicity)。可以理解为组成物质的基本单位,也是我们进行数据处理操作的基本单位,必须是一个整体不可分割。

2. C,就是一致性(Consistency)。一致性指的就是数据库在进行事务操作后,会由原来的一致状态,变成另一种一致的状态。也就是说当事务提交后,或者当事务发生回滚后,数据库的完整性约束不能被破坏。

3. I,就是隔离性(Isolation)。它指的是每个事务都是彼此独立的,不会受到其他事务的执行影响。也就是说一个事务在提交之前,对其他事务都是不可见的。

4. D,指的是持久性(Durability)。事务提交之后对数据的修改是持久性的,即使在系统出故障的情况下,比如系统崩溃或者存储介质发生故障,数据的修改依然是有效的。因为当事务完成,数据库的日志就会被更新,这时可以通过日志,让系统恢复到最后一次成功的更新状态。(这里就涉及到了回滚日志和重做日志的相关知识了)

 

. 事务的使用操作。

 

```

start transaction 或者 begin  #开启事物

 

savepoint   #在事物中创建一个保存点,方便后面可以回滚到某个点的操作

 

commint     #事务提交,这里提交后就相当于完成了,对数据库的改动就是永久性的了。

 

rollback    #事务回滚,执行这个就是将此次的事务中全部的操作都恢复到事物开始前的状态

 

rollback to [savepoint]  #将事务回滚到某个保存点

 

release  savepoint  #删除某个保存点

 

set transaction     #设置事务的隔离级别

 

```

1. 事务有隐式事务和显式事务两种方式,数据库默认一般都是隐式事务。

    

    1.1. 隐式事务,每次修改数据库后不需要手动commit命令,就直接修改数据库并保存结果,比如一般的增删改操作;

    

    1.2. 显示事务,需要在操作完最后一步,手动commit命令提交事务。

    ```

    #创建数据库

    mysql> create table user(

    -> name varchar(255),

    -> primary key (name)

    -> ) engine=InnoDB;

    Query OK, 0 rows affected (0.08 sec)

    

    #开启事务

    mysql> begin;

    Query OK, 0 rows affected (0.00 sec)

    

    #插入数据

    mysql> insert into user select '张三';

    Query OK, 1 row affected (0.01 sec)

    Records: 1  Duplicates: 0  Warnings: 0

    

    #查询,这里显示已经有了一条数据,但是我们还没有commit命令提交

    mysql> select * from user;

    +--------+

    | name   |

    +--------+

    | 张三 |

    +--------+

    1 row in set (0.00 sec)

    ```

    

    这里我们通过mysql的可视化工具去查看,或者在打开一个终端去查看

    ```

   

    #查看数据,显示的为空,因为我们上面的事务还没提交,这也就是事务的第三个特性(I),隔离性

    mysql> select * from user;

    Empty set

     

    mysql>

    ```

    我们返回之前的终端commit提交事务,在来查询。

    ```

    mysql> insert into user select '张三';

    Query OK, 1 row affected (0.01 sec)

    Records: 1  Duplicates: 0  Warnings: 0

    mysql> select * from user;

    +--------+

    | name   |

    +--------+

    | 张三 |

    +--------+

    1 row in set (0.00 sec)

    #提交

    mysql> commit;

    Query OK, 0 rows affected (0.04 sec)

     

    mysql>

    ```

   

    在另一个终端查询

    ```

    mysql> select * from user;

    Empty set

 

    mysql> select * from user;

    +--------+

    | name   |

    +--------+

    | 张三 |

    +--------+

    1 row in set (0.00 sec)

     

    mysql>

    ```

    这里在事务没有提交前,也就是插入数‘张三’,没有commit之前,别的任何查询都查不到这条数据,但是事务内查询是有这条数据,这就是事物隔离性,如果最后没有`commit`,而是执行的`rollback`,那么整个事务回滚,‘张三’这条数据依然不存在事务结束,这也就是事务的一致性,前后的状态都是一致的。

    

    这就是个人对事务的一些理解。如果有理解错误的地方请多指教,有帮到你请点个连接点个赞呗。

posted @ 2021-05-10 11:21  郭小萌萌1  阅读(59)  评论(0)    收藏  举报