--- 事务(Transaction):把多条DML语句捆绑在一起,要么同时执行成功要么同时执行失败

事务的执行sql:

      commit  --提交

      rollback  --回滚

      savepoint --保存点,便于回滚到某一位置,直接回滚是从头开始

事务的实现逻辑:

  1、开启事务机制

  2、执行DML语句

  3、提交事务或回滚(事务提交后将会永久修改硬盘文件内的数据 -- 结束 /// 事务回滚后不会修改硬盘文件上的数据 -- 结束)

例:微信转账,好友a给好友b转账100元

实际就是执行两条update的语句
1、update t_user set 账户余额 = 账户余额 - 1000 where user = a;
2、update t_user set 账户余额 = 账户余额 + 1000 where user = b;
以上两条DML语句就是一个事务,开启事务机制,两条语句开始执行,要么同时成功要么同时失败。

事务的四大特性:ACID

A:原子性 --事务是最小的工作单元,不可再分

C:一致性 --所有执行的DML语句必须同时失败或成功

I: 隔离性 --事务和事务之间必须有隔离

D:持久性 --最终数据必须持久化到硬盘文件中,事务才算成功结束

mysql当中事务是自动提交的

演示:

MySQL 事务回滚详解csdn mysql事务回滚机制_MySQL 事务回滚详解csdn

 一条insert语句执行后,数据会自动写入到表中来

关闭自动提交,演示事务实现逻辑的完整过程。

mysql> start transaction;               --关闭事务自动提交机制
Query OK, 0 rows affected (0.00 sec)

mysql> insert into t_user(username)values('test');  --插入数据
Query OK, 1 row affected (0.00 sec)

mysql> select * from t_user;      --查看表内数据
+----+----------+
| id | username |
+----+----------+
|  1 | ls       |
|  2 | sz       |
|  9 | yanshi   |
| 10 | test     |
+----+----------+
4 rows in set (0.00 sec)

mysql> rollback;           --回滚
Query OK, 0 rows affected (0.00 sec)

mysql> select * from t_user;   --再次查看表内数据,此时表内id=10的数据已经消失
+----+----------+
| id | username |
+----+----------+
|  1 | ls       |
|  2 | sz       |
|  9 | yanshi   |
+----+----------+
3 rows in set (0.00 sec)

几条语句下来,就验证了事务的实现逻辑,如果没有commit动作,事务结束后,是不会修改到硬盘内的数据

事务的隔离性也分为四大隔离等级

第一级别:读取未提交数据(read uncommitted)

 释:a关闭自动提交后,处于第一级别的隔离性,在执行DML语句后,未做commit动作,b查看这张表是能查看到未提交前a所执行的DML语句

缺点:存在脏数据,数据及其不稳定

第二级别:读取已提交数据(read committed)

释:a关闭自动提交后,处于第二级别的隔离性,在执行DML语句后,做完commit动作,b看到的是commit后的所有表内数据

缺点:不能重复读表内原始的数据,只能读commit后变更的数据

第三级别:可重复读(repeatable read)

释:commit后的数据不能读取到,只能读事务开启时的数据

第四级别:序列化读

释:排队读取,当a在读时,b就得一直等,直到a停止读取后,b才能读取

缺点:效率低,所有的事务都得进行排队

mysql当中默认的隔离级别是第三级别,而oracle中默认的隔离级别是第二级别

mysql> select @@global.tx_isolation;  --查看mysql的隔离级别
+-----------------------+
| @@global.tx_isolation |
+-----------------------+
| REPEATABLE-READ       |
+-----------------------+
1 row in set, 1 warning (0.00 sec)

 

有啥个人误解,望评论区指出,谢谢!