--- 事务(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当中事务是自动提交的
演示:
一条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)
有啥个人误解,望评论区指出,谢谢!