数据库事务隔离级别

什么是事务:事务是一个完整的业务逻辑单元,不可再分.

事务的存在是为了保证数据的完整性,安全性

提交或者回滚都会结束事务

事务包括四大特性: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默认自动提交

数据库事务隔离级别_第1张图片

怎么关闭自动提交?   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;(新版)
数据库事务隔离级别_第2张图片

演示:第一级别:读未提交(read uncommitted)

设置全局事务隔离级别为读未提交:set global transaction isolation level read uncommitted;

数据库事务隔离级别_第3张图片

 

演示第二级别:读已提交(read committed)

查看全局事务隔离级别:

select @@global.tx_isolation;(老版)

select @@global.transaction_isolation;(新版)

设置全局事务隔离级别为读已提交:set global transaction isolation level read committed;

数据库事务隔离级别_第4张图片

 数据库事务隔离级别_第5张图片

 存在的问题是不可重复读,不可重复读比较抽象,就是开启事务后,现在读的是13条记录,再查可能是14条,数据可能一直在变,事务里也跟着一直在变

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

查看全局事务隔离级别:

select @@global.tx_isolation;(老版)

select @@global.transaction_isolation;(新版)

设置全局事务隔离级别为可重复读:set global transaction isolation level repeatable read;

图上右边忘记截取commit了  效果一样

数据库事务隔离级别_第6张图片

 可重复读解决了不可重复读,但是出现了幻读现象

第四级别:事务排队,序列化读(serializable)/串行化读()

查看全局事务隔离级别:

select @@global.tx_isolation;(老版)

select @@global.transaction_isolation;(新版)

设置全局事务隔离级别为序列化读:set global transaction isolation level serializable;

演示时注意,设置完事务隔离级别后,退下,重新开窗口,有时候设置完,虽然显示隔离级别已变但是用的隔离级别却是上次的  注意下就好

设置事务隔离级别为序列化读

数据库事务隔离级别_第7张图片

 数据库事务隔离级别_第8张图片

 

你可能感兴趣的:(java,数据库,sql)