java mysql 事物_java基础之MySQL事务和视图

第三节 事务和视图

3.1事务

事务是用来维护数据库完整性的,它能够保证一系列的MySQL操作要么全部执行,要么全不执行。举一个例子来进行说明,例如转账操作:A账户要转账给B账户,那么A账户上减少的钱数和B账户上增加的钱数必须一致,也就是说A账户的转出操作和B账户的转入操作要么全部执行,要么全不执行;如果其中一个操作出现异常而没有执行的话,就会导致账户A和账户B的转入转出金额不一致的情况,为而事实上这种情况是不允许发生的,所以为了防止这种情况的发生,需要使用事务处理。

1. 事务的概念

事务(Transaction)指的是一个操作序列,该操作序列中的多个操作要么都做,要么都不做,是一个不可分割的工作单位,是数据库环境中的逻辑工作单位,由DBMS中的事务管理子系统负责事务的处理。

目前常用的存储引擎有InnoDB(MySQL5.5以后默认的存储引擎)和MyISAM(MySQL5.5之前默认的存储引擎),其中InnoDB支持事务处理机制,而MyISAM不支持。

2. 事务的特性

事务处理可以确保除非事务性序列内的所有操作都成功完成,否则不会永久更新面向数据的资源。通过将一组相关操作组合为一个要么全部成功要么全部失败的序列,可以简化错误恢复并使应用程序更加可靠。

但并不是所有的操作序列都可以称为事务,这是因为一个操作序列要成为事务,必须满足事务的原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。这四个特性简称为ACID特性。

1) 原子性

原子是自然界最小的颗粒,具有不可再分的特性。事务中的所有操作可以看做一个原子,事务是应用中不可再分的最小的逻辑执行体。

使用事务对数据进行修改的操作序列,要么全部执行,要么全不执行。通常,某个事务中的操作都具有共同的目标,并且是相互依赖的。如果数据库系统只执行这些操作中的一部分,则可能会破坏事务的总体目标,而原子性消除了系统只处理部分操作的可能性。

2) 一致性

一致性是指事务执行的结果必须使数据库从一个一致性状态,变到另一个一致性状态。当数据库中只包含事务成功提交的结果时,数据库处于一致性状态。一致性是通过原子性来保证的。

例如:在转账时,只有保证转出和转入的金额一致才能构成事务。也就是说事务发生前和发生后,数据的总额依然匹配。

3) 隔离性

隔离性是指各个事务的执行互不干扰,任意一个事务的内部操作对其他并发的事务,都是隔离的。也就是说:并发执行的事务之间既不能看到对方的中间状态,也不能相互影响。

例如:在转账时,只有当A账户中的转出和B账户中转入操作都执行成功后才能看到A账户中的金额减少以及B账户中的金额增多。并且其他的事务对于转账操作的事务是不能产生任何影响的。

4) 持久性

持久性指事务一旦提交,对数据所做的任何改变,都要记录到永久存储器中,通常是保存进物理数据库,即使数据库出现故障,提交的数据也应该能够恢复。但如果是由于外部原因导致的数据库故障,如硬盘被损坏,那么之前提交的数据则有可能会丢失。

【示例8】使用事务保证转账安全

-- 创建account账户表

create table account(

id int primary key auto_increment,

username varchar(30) not null,

balance double

);

-- 为account账户表同时插入两条数据

insert into account (username, balance) values('张三', 2000),('李四', 2000);

-- 查看account账户表中的数据

select * from account;

-- 开启转账事务

start transaction;

update account set balance=balance-200 where username='张三';

update account set balance=balance1+200 where username='李四';

select * from account;

-- 当我们关闭数据库重新打开后,张三和李四的账户余额并没发生任何变化。

-- 这是因为当我们使用“START TRANSACTION”开启一个事务后,该事务的提交方式不再是自动的,

-- 而是需要手动提交,而在这里,我们并没有使用事务提交语句COMMIT,

-- 所以对account表中数据的修改并没有永久的保存到数据库中,也就是说我们的转账事务并没有执行成功

-- 提交转账事务

commit;

-- 事务的回滚也可以看做是结束事务的标记,但是回滚的事务并没有执行成功,而是让数据库恢复到了执行事务操作前的初始状态。

-- 需要注意的是事务的回滚必须在事务提交之前,因为事务一旦提交就不能再进行回滚操作。

rollback;

3. 事务的并发问题

脏读(Dirty read)

当一个事务正在访问数据并且对数据进行了修改,而这种修改还没有提交到数据库中,这时另外一个事务也访问了这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据,那么另外一个事务读到的这个数据是“脏数据”,依据“脏数据”所做的操作可能是不正确的。

不可重复读

(Unrepeatableread): 指在一个事务内多次读同一数据。在这个事务还没有结束时,另一个事务也访问该数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改导致第一个事务两次读取的数据可能不太一样。这就发生了在一个事务内两次读到的数据是不一样的情况,因此称为不可重复读。

幻读

(Phantom read): 幻读与不可重复读类似。它发生在一个事务(T1)读取了几行数据,接着另一个并发事务(T2)插入了一些数据时。在随后的查询中,第一个事务(T1)就会发现多了一些原本不存在的记录,就好像发生了幻觉一样,所以称为幻读。

不可重复度和幻读区别:

不可重复读的重点是修改,幻读的重点在于新增或者删除。

解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表

例1(同样的条件, 你读取过的数据, 再次读取出来发现值不一样了 ):事务1中的A先生读取自己的工资为 1000的操作还没完成,事务2中的B先生就修改了A的工资为2000,导 致A再读自己的工资时工资变为 2000;这就是不可重复读。

例2(同样的条件, 第1次和第2次读出来的记录数不一样 ):假某工资单表中工资大于3000的有4人,事务1读取了所有工资大于3000的人,共查到4条记录,这时事务2 又插入了一条工资大于3000的记录,事务1再次读取时查到的记录就变为了5条,这样就导致了幻读

4. 事务的隔离级别

事务的隔离级别用于决定如何控制并发用户读写数据的操作。数据库是允许多用户并发访问的,如果多个用户同时开启事务并对同一数据进行读写操作的话,有可能会出现脏读、不可重复读和幻读问题,所以MySQL中提供了四种隔离级别来解决上述问题。

事务的隔离级别从低到高依次为READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ以及SERIALIZABLE,隔离级别越低,越能支持高并发的数据库操作。

【示例9】事务的隔离级别

-- 查看默认的事务隔离级别 MySQL默认的是repeatable read

select @@transaction_isolation;

-- 设置事务的隔离级别

set session transaction isolation level read uncommitted;

set session transaction isolation level read committed;

set session transaction isolation level repeatable read;

set session transaction isolation level serializable;

3.2 视图 view

1. 视图的概念

视图是一个从单张或多张基础数据表或其他视图中构建出来的虚拟表。同基础表一样,视图中也包含了一系列带有名称的列和行数据,但是数据库中只是存放视图的定义,也就是动态检索数据的查询语句,而并不存放视图中的数据,这些数据依旧存放于构建视图的基础表中,只有当用户使用视图时才去数据库请求相对应的数据,即视图中的数据是在引用视图时动态生成的。因此视图中的数据依赖于构建视图的基础表,如果基本表中的数据发生了变化,视图中相应的数据也会跟着改变。

2. 视图的好处

简化用户操作:视图可以使用户将注意力集中在所关心地数据上,而不需要关心数据表的结构、与其他表的关联条件以及查询条件等。

对机密数据提供安全保护:有了视图,就可以在设计数据库应用系统时,对不同的用户定义不同的视图,避免机密数据(如,敏感字段“salary”)出现在不应该看到这些数据的用户视图上。这样视图就自动提供了对机密数据的安全保护功能

【示例9】视图练习1

-- 创建或替换单表视图

create or replace view myview1

as

select empno, ename, job, mgr, hiredate, deptno

from emp

where hiredate < '1981-09-23'

with check option

-- 使用视图

desc myview1;

select * from myview1;

insert into myview1 values(9998,'9999','clerk',7839,'1980-12-23',20);

select * from emp

-- 删除视图

drop view myview1;

-- 多表视图

create or replace view myview2

as

select e.empno,e.ename,e.sal,d.deptno,d.dname

from dept d

join emp e on d.deptno = e.deptno

where sal >2500

select * from myview2

【示例10】视图练习2

--统计视图

create or replace view myview3

as

select d.deptno 部门编号,dname 部门名称,avg(sal) 平均工资,max(sal) 最高工资,count(*)人数

from emp e

join dept d

using(deptno)

where deptno is not null

group by deptno

order by avg(sal)

--基于视图的视图

create or replace view myview4

as

select * from myview3

where 最高工资>3000

-- 查看视图列表

show tables;

本节作业

1. 事务的概念和特征

2. 并发问题及其事务的隔离级别

3. 视图的定义和优点

4. 完成示例9,示例10视图操作

本知乎号每日更新2篇java基础视频贴,以及2-4篇java基础技术文章,有兴趣的同学可以关注学习。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/443095.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

define定义的是什么类型_DEFINE_PROFILE用法介绍(1)

“ 长风破浪会有时&#xff0c;直挂云帆济沧海&#xff01;”01—概述可以使用DEFINE_PROFILE定义一个自定义边界配置文件或单元格区域条件&#xff0c;该条件随空间坐标或时间而变化。可以自定义的变量如下:速度&#xff0c;压力&#xff0c;温度&#xff0c;湍流动能&#xf…

如何判断输入的是字符还是数字_[Leetgo]判断字符串是否为数字

题解分析代码实现实现一个函数用来判断字符串是否表示数值(包括整数和小数)。题解分析一个标识数字的字符串可能包括以下字符类型&#xff1a;空格&#xff1b;数组&#xff1a;0~9&#xff1b;正负号小数点幂符号&#xff1a;e/E&#xff1b;为了解决此类问题&#xff0c;需要…

mysql索引优化面试题_mysql索引优化面试题

曾经偷偷的面试了两个单位&#xff0c;都提到了Mysql的优化问题&#xff0c;所以以后要多多学习数据库的优化知识了。建设数据库的优化大概主要就是索引的优化了吧&#xff0c;因为我们不可能修改数据结构的情况下&#xff0c;提高数据库的查询效率似乎也只能用索引了。当然这也…

python 可视化大屏幕_如何用python搭建可视化看板?

可视化看板是指大屏 驾驶舱 dashboard这些吗&#xff0c;如果是&#xff0c;那不建议用python来做&#xff0c;不专业&#xff0c;目前没有见过哪个项目上的大屏是用python做的&#xff0c;它不是万能的大屏的制作一般是这样的先根据用户的需求&#xff0c;所在的行业&#xff…

mysql语句转为sql语句_MySQL 的分页查询 SQL 语句(转)

转自 https://www.cnblogs.com/wbxk/p/10644766.htmlMySQL一般使用 LIMIT 实现分页。基本语句为&#xff1a;SELECT ... FROM ... WHERE ... ORDER BY ... LIMIT ...在中小数据量的情况下&#xff0c;这样的SQL足够用了&#xff0c;唯一需要注意的问题就是确保使用了索引。举例…

mysql查询选课最少成绩最高_MySQL 练习

最近在学习MYSQL 数据库&#xff0c;在此mark 一下做过的sql 相关练习表结构如下&#xff1a;teacher表tidtnameclass表cidcaptioncourse表cidcnameteacher_idstudent表sidgenderclass_idsnamescore表sidstudent_idcourse_idnumclass :teacher : course : student :score : 根…

mysql中nchar_浅谈SQL Server、MySQL中char,varchar,nchar,nvarchar区别

1&#xff0c;定义&#xff1a;char&#xff1a; 固定长度&#xff0c;存储ANSI字符&#xff0c;不足的补英文半角空格。nchar&#xff1a; 固定长度&#xff0c;存储Unicode字符&#xff0c;不足的补英文半角空格varchar&#xff1a; 可变长度&#xff0c;存储ANSI字符&…

mysql 5.764_RHEL5.764位源码编译安装MySQL-5.5.42遇到的问题

由于MySQL从5.5之后的版本源码编译安装用cmake, make, make install安装,不用./Configure,make,make install 安装&#xff0c;所以要看下系由于MySQL从5.5之后的版本源码编译安装用cmake, make, make install安装,不用./Configure,make,make install 安装&#xff0c;所以要看…

java 判断子类_java判断class是否是某个类的子类或父类

Class c = ArrayList.class; c.isPrimitive(); //判断c是否为基本数据类型 c.isAssignableFrom(List.class); //判断c是否是List类的子类或父类 c.getGenericType(); //得到泛型类型 免费学习视频分享:java视频教程 实例:通过反射得到List 集合中的泛型类型package com.zf.ta…

java转日期_Java时间日期格式转换

import java.util.*;import java.text.*;importjava.util.Calendar;public classVeDate {/*** 获取现在时间**return返回时间类型 yyyy-MM-dd HH:mm:ss*/public staticString getNowDate() {Date currentTime newDate();SimpleDateFormat formatter new SimpleDateFormat("…

java 对比工具_Java几款性能分析工具的对比

在给客户进行应用程序维护的过程中&#xff0c;我注意到一些关于高负载条件下的性能问题。理论上&#xff0c;增加对应用程序的负载会使性能有所下降&#xff0c;但是我认为性能下降的比率远远高于负载的增加&#xff0c;同时我也发现&#xff0c;性能可以通过改变应用程序的逻…

java for循环获取value_Java遍历取出Map集合key-value数据的4种方法

将map集合存数据与取出数据全部放在一个类MapTest中&#xff0c;方便阅读与查看随便创建一个包&#xff0c;在包中新建一个class文件&#xff0c;(也可以不建包&#xff0c;直接新建一个class文件)新建class文件MapTest.java,代码如下&#xff1a;import java.util.HashMap;imp…

as3调用java_关于openamf我用as3链接java程序,并调用相关的方法,但是能够连上,却不能够调用是怎么回事...

我用的openamf做flashremoting服务器是没问题的&#xff01;这是as的代码&#xff01;package{importflash.display.Sprite;importflash.net.ObjectEncoding;importcom.riafan.remoting.PendingCall;import...我用的openamf做flash remoting服务器是没问题的&#xff01;这是as…

phoenix hbase java_java jdbc访问hbase phoenix

上面直接介绍了druid访问hbase phoenix的案例hbase Phoenix整合mybatis DruidDataSource这里还是贴一下jdbc直接访问的方式。public static void main(String[] args) {try {Class.forName("org.apache.phoenix.jdbc.PhoenixDriver");Properties propertiesnew Prope…

mp4v2 写mp4 java_使用mp4v2将H264+AAC合成mp4文件

录制程序要添加新功能&#xff1a;录制CMMB电视节目&#xff0c;我们的板卡发送出来的是RTP流(H264视频和AAC音频)&#xff0c;录制程序要做的工作是&#xff1a;(1)接收并解析RTP包&#xff0c;分离出H264和AAC数据流&#xff1b;(2)将H264视频和AAC音频以某种格式封装&#x…

java完全解耦_java-完全解耦

完全解耦&#xff1a;降低代码的限制性&#xff0c;是同一代码能够用到更多的程序中1 packageinterfaces.interfaceprocessor;2 import staticnet.mindview.util.Print.print;34 interfaceProcessor {5 String name();6 Object process(Object input);7 }8 public classApply{9…

java验证xml格式是否正确的是_spring源码附录(1)java实现对XML格式的验证

最近在看spring源码&#xff0c;涉及到xml文档的解析、xml文档的格式验证&#xff0c;发现自己对xml解析的基础较为薄弱&#xff0c;本篇博客复习下DOM方式解析xml(即spring解析xml的方式)。DOM解析XML是将整个XML作为一个对象&#xff0c;占用内存较多。另外一个java官方的XML…

java 批量打印_JAVA批量打印皕杰报表

原标题&#xff1a;JAVA批量打印皕杰报表不使用皕杰报表工具条上的打印按钮&#xff0c;用java怎么实现批量打印皕杰报表呢&#xff1f;解决方案&#xff1a;皕杰报表提供了批量打印的工具类ReportToolkits&#xff0c;ReportToolkits类参考帮助文档-开发指南-javadoc-bios.rep…

java 截串_java字符串截取

import org.apache.commons.lang.stringutils;public class substr{public static void main(string[] args) {string str "1234567890abcdefg";system.out.println("-----------" str.substring(0)); //从字符串索引为0开始截取&#xff0c;一直到字符串…

java json 构造_json 构造和解析

目录&#xff1a;(1)引入jar包&#xff1b;(2)json的构造&#xff1b;(3)json的解析&#xff1b;(4)遍历未知key。(1)java对json的处理&#xff0c;可借助org.json.jar.org.jsonjson20090211(2)json的构造//construct json and output itpublic String constructJson() throws …