你了解Spring事物控制特性吗

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

内容简介:原子性:强调事务的不可分割 一致性:强调的是事务的执行的前后,数据的完整性要保持一致 隔离性:一个事务的执行不应该受到其他事务的干扰 持久性:事务一旦结束(提交/回滚)数据就持久保持到了数据库脏读:一个事务读到另一个事务还没有提交的数据 不可重复读:一个事务读到了另一个事务已经提交的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窗口马上就会显示数据
复制代码

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

查看所有标签

猜你喜欢:

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

深入浅出Node.js

深入浅出Node.js

朴灵 / 人民邮电出版社 / 2013-12-1 / CNY 69.00

本书从不同的视角介绍了 Node 内在的特点和结构。由首章Node 介绍为索引,涉及Node 的各个方面,主要内容包含模块机制的揭示、异步I/O 实现原理的展现、异步编程的探讨、内存控制的介绍、二进制数据Buffer 的细节、Node 中的网络编程基础、Node 中的Web 开发、进程间的消息传递、Node 测试以及通过Node 构建产品需要的注意事项。最后的附录介绍了Node 的安装、调试、编码......一起来看看 《深入浅出Node.js》 这本书的介绍吧!

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

多种字符组合密码

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具