什么是事务:事务是一个完整的业务逻辑单元,不可再分.
事务的存在是为了保证数据的完整性,安全性
提交或者回滚都会结束事务
事务包括四大特性:ACID
A:原子性:事务是最小的工作单元,不可再分.
C:一致性:事务必须保证多条DML语句同时成功或者同时失败.
I:隔离性:事务A与事务B之间具有隔离.
D.持久性:持久性说的是最终数据必须持久化到硬盘文件中,事务才算成功的结束.
关于事务之间的隔离性:
事务隔离性存在隔离级别,理论上隔离级别包括4个: 理论上有4个级别,但基本上所有数据库二档起步,Mysql数据库默认的隔离级别是:第三级别-->可重复读. Oracle数据库默认的隔离级别是:读已提交
第一级别:读未提交(read uncommitted)
对方事务还没提交,我们当前事务可以读取到对方未提交的数据.---->脏读
读未提交存在脏读(Dirty Read)现象:表示读到了脏的数据.(未提交,读到的有可能是缓存中的数据,不稳定)
第二级别:读已提交(read committed)----->这种隔离级别解决了脏读现象,基本也是所有数据库默认级别的开始
对象事务提交之后的数据我方可以读取到.
这种隔离级别解决了:脏读现象没有了.
存在的问题不可以重复读(Non-repeatable Read)
读已提交存在的问题是:不可重复读.--->不可重复读的意思:开启事务,当别人一直在改变 数据时,每次查询的数据不一致
第三级别:可重复读(repeatable read)
这种隔离级别解决了:不可重复读的问题
这种隔离级别存在的问题是:读取到的数据可能是幻读,数据已改变或不存在---------->幻读
第四级别:事务排队,序列化读(serializable)/串行化读
解决了所有问题.
但是效率低,事务排队
开了两个窗口演示事务隔离级别
drop table if exists t_user;
create table t_user(
id int primary key auto_increment,
username varchar(255)
);
Mysql默认自动提交
怎么关闭自动提交? start transaction;开启事务就可以关闭自动提交
rollback或者commit都可以结束事务,rollback是回滚,commit是提交
插入点数据
insert into t_user(username)value('zs');
insert into t_user(username)value('lisi');
insert into t_user(username)value('wangwu');
注意:测试时,设置完全局事务隔离级别后,最好关下两窗口,有事可能显示级别对的,但是实际上事务级别停留在上次
查看全局事务隔离级别:
select @@global.tx_isolation;(老版)
select @@global.transaction_isolation;(新版)
演示:第一级别:读未提交(read uncommitted)
设置全局事务隔离级别为读未提交:set global transaction isolation level read uncommitted;
演示第二级别:读已提交(read committed)
查看全局事务隔离级别:
select @@global.tx_isolation;(老版)
select @@global.transaction_isolation;(新版)
设置全局事务隔离级别为读已提交:set global transaction isolation level read committed;
存在的问题是不可重复读,不可重复读比较抽象,就是开启事务后,现在读的是13条记录,再查可能是14条,数据可能一直在变,事务里也跟着一直在变
演示第三级别:可重复读(repeatable read)
查看全局事务隔离级别:
select @@global.tx_isolation;(老版)
select @@global.transaction_isolation;(新版)
设置全局事务隔离级别为可重复读:set global transaction isolation level repeatable read;
图上右边忘记截取commit了 效果一样
可重复读解决了不可重复读,但是出现了幻读现象
第四级别:事务排队,序列化读(serializable)/串行化读()
查看全局事务隔离级别:
select @@global.tx_isolation;(老版)
select @@global.transaction_isolation;(新版)
设置全局事务隔离级别为序列化读:set global transaction isolation level serializable;
演示时注意,设置完事务隔离级别后,退下,重新开窗口,有时候设置完,虽然显示隔离级别已变但是用的隔离级别却是上次的 注意下就好
设置事务隔离级别为序列化读