事务
1.事务概述
-
事务是一个完整的业务逻辑单元,不可再分。
-
例如:银行账户转账,从用户actno-001向actno-002转账10000,需要执行两条update语句
update t_act set balance = balance - 10000 where actno='actno-001'; update t_act set balance = balance + 10000 where actno='actno-002';
以上两条语句必须同时成功或者同时失败,就需要使用数据库中的“事务机制”。
-
和事务有关系的语句:DML语句(insert delete update)。
-
事务执行过程:
开启事务机制→执行事务中操作,不会与文件交互,而是保存导数据库的操作历史中→提交事务/回滚事务
-
提交事务:commit
回滚事务:rollback
-
事务特性ACID:
A:原子性:事务是最小的工作单元,不可再分。
C:一致性:事务必须保证多条DML语句同时成功/失败
I:隔离性:事务A和事务B之间具有隔离
D:持久性:持久性指的是最终数据必须持久化导硬盘文件中,事务才算成功结束。
-
事务之间的隔离性,理论上隔离级别包括4个:
第一级别:读未提交(read uncommitted)
对方事务还未提交,当前事务可以读到对方未提交的数据。读未提交存在脏读(Dirty Read)现象:表示读到了脏的数据
第二级别:读已提交(read committed)
解决了脏读现象。对方事务提交之后的数据,当前事务可以读取到。但不可重复读。
第三级别:可重复读(repeatable read)
解决了不可重复读问题。但读到的数据是幻想
第四级别:序列化读/串行化读
解决了多有问题。效率低,需要事务排队。
-
注:mysql数据库默认的隔离级别是:可重复读。
oracle数据库默认的隔离级别是:读已提交。
2.演示事务
- mysql事务默认的情况下是自动提交的
#准备表
mysql> drop table if exists t_user;
mysql> create table t_user(
-> id int primary key auto_increment,
-> username varchar(255)
-> );
#演示
#插入一条数据
mysql> insert into t_user(username) value('zs');
mysql> select * from t_user;
+----+----------+
| id | username |
+----+----------+
| 1 | zs |
+----+----------+
#回滚
mysql> rollback;
mysql> select * from t_user;
+----+----------+
| id | username |
+----+----------+
| 1 | zs |
+----+----------+
- 关闭自动提交:start transaction
#关闭自动提交
mysql> start transaction;
#插入记录
mysql> insert into t_user(username) values('ice');
mysql> insert into t_user(username) values('coffee');
mysql> select * from t_user;
+----+----------+
| id | username |
+----+----------+
| 1 | zs |
| 2 | ice |
| 3 | coffee |
+----+----------+
#回滚
mysql> rollback;
mysql> select * from t_user;
+----+----------+
| id | username |
+----+----------+
| 1 | zs |
+----+----------+
#rollback事务已经结束。
#测试提交事务
mysql> start transaction;
#插入数据
mysql> insert into t_user(username) values('ice');
mysql> insert into t_user(username) values('coffee');
mysql> commit;
mysql> select * from t_user;
+----+----------+
| id | username |
+----+----------+
| 1 | zs |
| 4 | ice |
| 5 | coffee |
+----+----------+
学习视频:动力节点MySQL基础入门到精通