这是我参与11月更文挑战的第8天,活动详情查看:2021最后一次更文挑战
6、事务
-
概念:transaction ,一个事务就是一个完整的业务逻辑
- 完整的业务逻辑 :不可再分的最小的工作单元
-
只有DML语句和事务有关系 , 因为只有DML语句是操作数据库中的数据的。涉及数据的改动,一定要保证安全。数据安全第一位
-
理解:
-
1、事务需要多条语句协同完成,相当于封装
-
2、一个事务就是多条DML语句同时成功、同时失败
-
3、在事务的执行过程中可以提交、回滚事务
-
提交:清空事务性活动的日志文件(临时文件),将数据彻底持久化到数据库表之中。提交事务标志着事务的结束,并且是全部成功的结束。
- commit 语句
-
回滚:清空事务性活动的日志文件(临时文件),将之前的所有DML操作全部撤销。回滚事务标志着事务的结束,并且是全部失败的结束。
- rollback 语句 , 只能回滚到上一次的提交点
-
-
4、mysql中默认的事务行为 : 自动提交(每执行一次,提交一次)
-
5、关闭自动提交机制 : start transaction ;
-
【案例】:测试提交事务和回滚事务
drop table if exists dept_bak ;
create table dept_bak(
DEPTNO int(2) not null ,
DNAME varchar(14) ,
LOC varchar(13) ,
primary key (DEPTNO)
);
select * from dept_bak ; // 记为表1
start transaction ;
insert into dept_bak (deptno , dname , loc) values (10 , 'SALES' , 'SHANDONG');
insert into dept_bak (deptno , dname , loc) values (20 , 'SALES' , 'SHANDONG');
insert into dept_bak (deptno , dname , loc) values (30 , 'SALES' , 'SHANDONG');
insert into dept_bak (deptno , dname , loc) values (40 , 'SALES' , 'SHANDONG');
select * from dept_bak ; // 记为表2 , 查看与表1的区别
rollback ;
select * from dept_bak ; // 记为表3 , 查看与表2的区别
insert into dept_bak (deptno , dname , loc) values (10 , 'SALES' , 'SHANDONG');
insert into dept_bak (deptno , dname , loc) values (20 , 'SALES' , 'SHANDONG');
insert into dept_bak (deptno , dname , loc) values (30 , 'SALES' , 'SHANDONG');
insert into dept_bak (deptno , dname , loc) values (40 , 'SALES' , 'SHANDONG');
select * from dept_bak ;
commit;
rollback ;
select * from dept_bak ; // 记为表4 , 查看与表2,3的区别
【结论】:rollback可以回滚到上一次的commit处
无论是提交事务还是回滚事务都会结束事务
-
事务的特性:ACID
- 原子性:说明事务是最小的工作单元,不可再分
- 一致性:在同一个事务中,所有的数据必须一次成功或者同时失败
- 隔离性:A事务和B事务之间具有一定的隔离 (两个事务同时操作同一张表,类似于多线程并发访问同一张表)
读未提交:read uncommitted ;
- 描述:(最低事务隔离级别)事务A可以读取到事务B未提交的数据 - 存在问题:脏读现象(dirty read)称读到了脏数据(未提交的数据),基本不用 - 读已提交:read committed ; - 描述:事务A只能读取到事务B提交之后的数据 - 解决问题:解决了脏读现象 - 存在问题:不可重复读取数据 - 数据100% 的真实。是oracle数据库默认的事务隔离级别 - 可重复读:repeatable read ; - 描述:事务A开启之后,读取到的事务B中的数据都是一致的。即使在A开启后B事务的数据修改并且提交了,事务A读取到的数据还是不变 相当于把表复制了一份,使用复印件进行操作。退出事务之后再次查询,或者开启新的事务,数据才会更新。 - 解决问题:解决了不可重复读取数据的问题 - 存在问题:可能会出现幻影读现象(读取到的数据都是幻象,数据不真实) - 是 mysql 中默认的事务隔离级别 - 序列化 / 串行化:serializable ; - 描述:(最高事务隔离级别,效率最低),表示事务排队。类似于synchronized(线程同步) - 解决问题:解决了所有级别 - 存在问题:效率最低- 持久性:事务最终结束的一个保障