你了解Spring事物控制特性吗

栏目: Java · 发布时间: 5年前

内容简介:原子性:强调事务的不可分割 一致性:强调的是事务的执行的前后,数据的完整性要保持一致 隔离性:一个事务的执行不应该受到其他事务的干扰 持久性:事务一旦结束(提交/回滚)数据就持久保持到了数据库脏读:一个事务读到另一个事务还没有提交的数据 不可重复读:一个事务读到了另一个事务已经提交的update数据,导致在当前的事务中多次查询数据不一致 虚读/幻读:一个事务读到另一个事务已经insert数据,导致当前事务中多次查询结果不一致引发两类丢失更新

原子性:强调事务的不可分割 一致性:强调的是事务的执行的前后,数据的完整性要保持一致 隔离性:一个事务的执行不应该受到其他事务的干扰 持久性:事务一旦结束(提交/回滚)数据就持久保持到了数据库

二、如果不考虑隔离性,会引发一些安全性问题

读问题
复制代码

脏读:一个事务读到另一个事务还没有提交的数据 不可重复读:一个事务读到了另一个事务已经提交的update数据,导致在当前的事务中多次查询数据不一致 虚读/幻读:一个事务读到另一个事务已经insert数据,导致当前事务中多次查询结果不一致

写问题
复制代码

引发两类丢失更新

三、解决引发的读问题

设置事务的隔离级别 read uncommitted :未提交读。脏读,不可重复读,虚读都可能发生 read committed :已提交读。避免脏读,不可重复读和虚度有可能发生 repeatable read :可重复读。避免脏读和不可重复读,虚读可能发生 serializable :串行化的。避免脏读,不可重复读,虚读的发生

select @@tx_isolation; 查看隔离级别
set session transaction isolation level 级别; 设置隔离级别
复制代码

四、演示读问题

演示脏读
复制代码

1.分别开启两个dos窗口 A.B 2.先查看两个窗口的隔离级别 select @@tx_isolation; 3.设置A窗口的隔离级别为未提交读

set session transaction isolation level read uncommitted
复制代码

4.分别在两个窗口开启事务

start transaction;
复制代码

5.分别开启两个dos窗口 A.B

update account set money = money - 1000 where name = '张森';
update account set money = money + 1000 where name = '凤姐';
复制代码

6.在A窗口查询数据select * from account; -- A事务读到了B事务还没有提交的数据;

演示避免脏读,演示不可重复读发送
复制代码

1.分别开两个窗口,A.B 2.设置A窗口的隔离级别:read committed

set session transaction isolation level read committed;
复制代码

3.分别在两个窗口开启事务 start transaction; 4.在B窗口完成转账

update account set money = money - 1000 where name = '张森';
update account set money = money + 1000 where name = '凤姐';
复制代码

5.在A窗口进行查询

select * from account; -- 避免脏读
复制代码

6.在B窗口提交事务

commit;
复制代码

7.在A窗口中再次查询

select * from account;  转账成功.(不可重复读:一个事务读到另一个事务中已经提交的update的数据,导致多次查询结果不一致.)
复制代码
避免脏读和不可重复读,演示虚读
复制代码

1.分别开启两个窗口,A.B 2.设置A窗口的隔离级别: repeatable read

set session transaction isolation level repeatable read;
复制代码

3.分别在两个窗口中开启事务

start transaction;
复制代码

4.在B窗口完成转账的操作

update account set money = money - 1000 where name = '张森';
update account set money = money + 1000 where name = '凤姐';
复制代码

5.在A窗口查询

select * from account; -- 转账没有成功:避免脏读.
复制代码

6.在B窗口提交事务

commit;
复制代码

7.在A窗口再次查询

select * from account; -- 转账没有成功:避免不可重复读.
复制代码
避免虚读
复制代码

1.分别开启两个窗口,A.B 2.设置A窗口的隔离级别:repeatable read

set session transaction isolation level repeatable read;

复制代码

3.分别在两个窗口中开启事务

start transaction;
复制代码

4.在B窗口完成插入操作

insert into account values (null,'王老师',10000)
复制代码

5.在A中进行查询操作

select * from account; -- 没有查询到任何结果
复制代码

6.在B窗口提交事务

commit; -- A窗口马上就会显示数据
复制代码

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

程序开发心理学

程序开发心理学

(美)杰拉尔德·温伯格 / 邓俊辉 / 清华大学出版社 / 2004-1-1 / 39.00元

本书开创"以人为本"研究方法的先驱,在长达25年的岁月中一直保持活力,至今仍在继续。1997年,本书作者温伯格因其在软件领域的杰出贡献,被美国计算机博物馆的计算机名人堂选为首批5位成员之一。 在计算机界,还没有任何一本计算机方面的书,在初次出版之后,能够在长达25年的岁月中一直保持活力--而且这种活力到今天仍在继续。《程序开发心理学》是开创"以人为本"研究方法的先驱,它以其对程序员们在智力、......一起来看看 《程序开发心理学》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

SHA 加密
SHA 加密

SHA 加密工具