事物_软件分层
事务
事务是:在数据库指业务处理的”一个业务“对应数据库中的多个步骤的操作。例如银行转账。
面对的问题:程序接受请求后,会至少发送两条SQL语句,两条语句之间会有时间的间隔,如果间隔时间期间Mysql服务器发生意外,导致第二条SQL无法执行,导致整个业务的最终数据错误。所以,所有的数据库软件,都必须具有一种能力,可接收一系列的“SQL”语句,将这些SQL语句看做是一个“整体”执行后,要么全部成功,要么全部失败这种能力就是:事务处理
数据库中的事务操作
- JDBC操作数据库的事务操作
- DBUtils中的数据库的事务操作
数据库中的事务处理:1、手动提交、2、自动提交情况下开启一个临时事务处理
- mysql中默认的事务处理方式,自动提交–将每条SQL语句看做是一个独立的事务,执行后会立即更改数据库,与其他的SQL语句没有关联。不能满足我们对事务的处理需求。
- 怎么查看当前mysql的事务处理方式:show variables like ‘autocommit’;
mysql中的事务处理的两种
- 关闭自动提交:set autocommit =off;(开启是 ON)
- 执行SQL语句
- 提交/回滚:commit;//提交 | rollback;回滚
- 【注意】当提交或者回滚后,之前的SQL语句被全部处理。要么全部更改打数据库,要么全部取消。之后新的SQL语句,就是新的事务。
- 【注意】 事务提交后不能被回滚,回滚之后也不能被提交了。
在“自动提交”状态下,开启临时一个“手动事务”
- 开启临时事务:start tansaction;
- 执行SQL语句
- 提交或回滚临时事务:commit; | rollback;
- 【注意】只要提交事务,这个事务就结束了,立即恢复到之前的自动事务状态
- 【注意】事务对于mysql是“回话级别的”每个回话都可以单独设置事务的处理,会不影响,互相隔离;
- 【注意】在一个“会话中”的查询结果是可以查询到之前修改的结果不论是否提交/回顾;但在另一个回话中,查询时查询不出来的。
代码
JDBC中的事务处理
public class Demo {public static void main(String[] args)throws Exception {String url="jdbc:mysql://localhost:3306/db_demo";String user="root";String pwd="123456";//注册驱动Class.forName("com.mysql.jdbc.Driver");//获取连接Connection con = DriverManager.getConnection(url,user,pwd);//关闭数据库自动提交con.setAutoCommit(false);//获取SQL执行器Statement stmt = con.createStatement();try{String sql1="update account set balance=balance-1000 where userName='zhangsan'";int row1 = stmt.executeUpdate(sql1);String sql2="update account set balance=balance+1000 where userName='lisi'";int row2 = stmt.executeUpdate(sql2);System.out.println(row1+" ==="+row2);if(row1!=1||row2!=1){con.rollback();System.out.println("回滚了");}else{con.commit(); }}catch(Exception e){con.rollback();System.out.println("异常了 回滚了");e.printStackTrace();}con.close();
}
}
DBUtils中的事务处理
public class Demo {public static void main(String[] args) throws Exception{//创建QueryRuanner对象是Dbutils工具类里的类 查询、增删改等操作QueryRunner qr=new QueryRunner();//创建连接池状态ComboPooledDataSource ds= new ComboPooledDataSource();Connection con = ds.getConnection();con.setAutoCommit(false);try{String sql1="update account set balance=balance-1000 where userName='zhangsan'";String sql2="update account set balance=balance+1000 where userName='lisi'";int row1 = qr.update(con, sql1);int row2 = qr.update(con, sql2);if(row1!=1||row2!=1){con.rollback();System.out.println("出错了");}else{con.commit();System.out.println("成功了");}}catch(Exception e){con.rollback();System.out.println("异常了,回滚了");}con.setAutoCommit(true);con.close();}
}
软件分层
1).视图层(view):负责接收数据、命令、展示数据;
2).控制层(controller):负责接收视图层的数据、命令,寻找相应的”业务层”进行处理(业务分发)
3).业务层:负责具体的业务逻辑实现
4).持久层(Dao):负责持久化数据的(访问数据库)
5).模型层(model):负责封装数据,在各层之间传递数据。
分层的好处:
1).将代码解耦,使各功能部分的代码之间的耦合度降到最低。不同功能的代码分到不同的类中存储,后期需要修改时,修改哪部分代码,就找哪层的类即可,其它类不用改。
有一句话:高内聚、低耦合
高内聚:功能相同、相近的代码放到同一个类中;
低耦合:各功能的代码之间降低耦合;
事务特性 ACID
- 原子性
- 一致性
- 隔离性
- 持久性
不考虑两个事务的隔离性会产生的问题
- 脏读:一个事务读到了另一个事务未提交的数据.
- 不可重复读:一个事务读到了另一个事务已经提交(update)的数据。引发另一个事务,在事务中的多次查询结果不一致。
- 虚读/幻读:一个事务读到了另一个事务已经提交(insert)的数据。导致另一个事务,在事务中多次查询的结果不一致。
事务的隔离级别
1).read uncommitted:读未提交;最低级;基本上不隔离。可以读到脏数据。
2).read committed:读已提交;可以解决脏读,但不能解决”不可重复读”和”幻读”;
3).repeatable read: 可重复读。在MYSQL下可以解决:脏读、不可重复的、幻读;(MySQL的默认级别)
4).serializable :将两个事务完全隔离,一个事务未结束时,另一个事务必须等待;
查看当前数据库的隔离级别:
select @@tx_isolation;
设置会话的事务隔离级别:
set session transaction isolation level 上面的四个隔离级别之一;
安全和性能对比
安全性:serializable > repeatable read > read committed > read uncommitted
性能 : serializable < repeatable read < read committed < read uncommitted
常见数据库的默认隔离级别:
MySql:repeatable read(第三级)
Oracle:read committed(第二级)
ThreadLocal 类的工作原理
可以保存一个Connection对象,当Dao层需要的时候可以直接获取数据库连接对象。不需要每层在传递Connection对象,到Dao层。
相关文章:

雷林鹏分享:jQuery EasyUI 数据网格 - 创建属性网格
jQuery EasyUI 数据网格 - 创建属性网格 属性网格(property grid)带有一个内置的 expand(展开)/collapse(合并) 按钮,可以简单地为行分组。您可以简单地创建一个可编辑属性的分层(hierarchical)列表。 设置 HTML url"propertygrid_data.json" showGroup&q…

as3.0中如何阻止事件冒泡?
as3.0中的事件冒泡机制有时候会很烦人,比如一个Sprite(方便下文描述就命名为Container吧)把另一外Sprite(称为Child吧)做为子元素套进来以后,如果两个Sprite都注册了Mouse_Down事件,要想在Child上点击鼠标时系统只响应Child的Mouse_Down事件&…

紫色回归线:雅虎中国的运筹学
共同体并不意味着一个我们可以获得享受的世界,而是一个我们热切希望栖息、希望重新拥有的世界。—— 齐格蒙特.鲍曼紫色回归线:雅虎中国的运筹学紫色是比较中性的颜色,但紫色在生活中却也是温柔、神秘、甚至性感的代词。当雅虎中国将主色调重…

JavaScript_上
javaScript JavaScript,简称JS,是Web开发中不可缺少的脚本语言的,不需要编译就可以运行(解释性语言)。它“寄生”在HTML体内,随网络传输到客户端在浏览器中运行。js代码可以写到html的任何地方。一般写在 body 结束标签…

java类加载的表现形式
java中的类是动态加载的,我们先看一下我们常用的类加载方式,先有一个感性的认识,才能进一步 深入讨论,类加载无非就是下面三种方式。 class A{} class B{} class C{} public class Loader{ public static void main(String[] args) throws Ex…

.net core在vs开发环境下脱离iis运行
.net core相比之前.net的是一个可以跨平台,脱离iis运行的语言,并且项目启动的效率要比用iis启动快,可以说进一步提高了开发的效率。要想自己的项目core脱离iis,首先选择vs启动项目的载体: 如下图,不要选择I…

Sublime遇见中文乱码问题?
今天在写demo的时候,突然发现html页面上的中文在浏览器上显示乱码~!!!!! 这时,我根据网上的提示安装了两个插件:converttoUtf-8,support Gbk ~~~然而,好像无济于事~~ 于是…

Dynamics AX 2009 升级PreSynchnoize时的无反应的解决
问题: 安装完升级补丁后在Data upgrade cockpit窗口点击Run或Train Run按钮后Update Job没有开始,始终显示为Ready状态。 #1 原因:数据库以前已经做过升级(例如安装过AX 2009 SP1)并且已经存在一个DataUpdate批处理组但是针对这个…

如何 搭建 RMAN 备份平台
一. RMAN 的一些理论知识RMAN Catalog 和 Nocatalog 的区别http://blog.csdn.net/tianlesoftware/archive/2010/06/02/5641763.aspxRMAN 系列(一)---- RMAN 体系结构概述http://blog.csdn.net/tianlesoftware/archive/2010/06/09/5659701.asp…

git更新代码报错,error: The following untracked working tree files would be overwritten by ch
git忽略大小写导致的, git config --add core.ignorecase true 转载于:https://www.cnblogs.com/newcbs/p/10732662.html

JavaScript_下_Dom
Dom对象 Dom对象:Document Object Model 文档对象模型。js是用来操作html的。 一个文档必须被加载到浏览器中,会按照HTML的层级结构转换成一个“家谱树”称为dom树。HTML文档里的所以的标签,属性,文本都会转换成dom树上的节点。 …

HDU 4300 Clairewd’s message
一道KMP的变式 本题仍是求最大前缀后缀,所以仍用KMP,但不同的是,本题有一个密码转换规则,不过好在题目中说了两段不重合,那么我们就可以在中间插入一个特殊符号*,保证求next数组时不会越过中线,…

GNS3模拟VPC注意几点
网上的GNS3入门到精通视频的确做得不错。现我写一下主要几点:1、创建MS lookback 适配器在添加硬件那里,并注意IP设置要在本地网卡同一子网,网关不用设置的。2、GNS3 的Dynamips目录的cygwin1.dll文件替代VPCS目录中文件。3、GNS3中的模拟PC先…

Windows Phone 7 Tip (5) -- App liftcycle
在新的trainning kit 中有一个例子解释的很清楚了: 1. Application_Launching:只有在新启动程序时触发 2. Application_Closing:只有在推出程序时触发--只有在程序mainpage时按硬后退键 3. Application_Activated:从home键或者其它…

npm i和npm install的区别
最近人用npm i来直接安装模块,但是有会报错,用npm install就不会报错,刚开始百思不得其解,它俩明明是同一个东西后来查npm的帮助指令发现还是没区别,npm i仅仅是npm install的简写: 实际使用的区别点主要如…

获取服务器路径的方式 【记录】
JSP页面获取服务器路径的方式 1.basePath方式 <% String path request.getContextPath(); String basePath request.getScheme()"://"request.getServerName()":"request.getServerPort()path"/"; %> 在url加入<%basePath%>如&…

系统安全设置部分项
1.设置合理的操作超时锁定(10分钟以内),在恢复时需要重新鉴别。 开启连接超时 vim /etc/ssh/sshd_config ClientAliveInterval 120 //设置超时时间2分钟 ClientAliveCountMax 3 重启 /etc/init.d/sshd restart 2.设置TMOUT将自动在所设置…

简单的分级别写日志程序
/************************************************************************/ /* * 文件名称:write_log.cpp * 摘 要:此文件实现了普通WINDOWS程序中的日志功能 * 主要有以下特点: * 1. 根据日期创建日志文件目录,每天的日志分别…

达内——java变量
package xx;//为class文件分目录 import xx.xx//导入包中的类 public class 类名{ public static void main(String args[]){ } } 准备工作: jdk jre jvm gc idea pi 配置环境变量 变量名支持字母,数字,_和$,但是数字不能开头&…

JSON Web Tokens测试工具
JSON Web Tokens官方提供测试工具https://jwt.io某些静态资料需要链接google、twitter服务器,被墙无法访问。现在提供可以方法测试工具http://hingtai.cn:8000/转载于:https://www.cnblogs.com/birdstudio/p/7985617.html

oracle 分页写法
select * from (select ROWNUM RN ,TT.* from ( select * from YQ_FEED_BACK_MESSAGE WHERE MODEL_TYPE 3 AND FEED_BACK_TYPE4 order by FEED_BACK_DATE DESC)TT where rownum<5 )where RN >0

给GRUB添加新的项目
安装了win10,然后又安装了manjaro,最后又安装了Ubuntu。开机默认就是进入的Ubuntu的grub,然而我比较喜欢manjaro的grub主题。在bios中设置manjaro的引导为默认引导,但是此时manjaro的grub没有Ubuntu,进入到manjaro系统…

Netapp存储基础之WAFL, NVRAM, RAID, SnapShot
此章节是重点之重点。先讲基本概念。WAFL的全称是Write Anywhere File Layout. 从类似于其它UNIX的文件系统比如Berkeley Fast File System (FFS) 和 TransArc Episode file system. 它的核心理念是"文件任意地方写"。先说普通的文件系统,是由inode和data…

读取本地照片 以流的形式进行显示
获取到前端传来的文件名称,到相应的文件中去读取,通过流的形式写到响应体中。 /*** 显示图片 * getFeedBackPicture.do?picName* return*/RequestMapping(value"/viewPhoto/{photopath}")public void getFeedBackPicture(HttpServletRespons…

如何轻松搞定机构资格准入?
银联的“资格入网”虽涉及环节庞杂,但杂而有序,初次接触银联的机构极有可能不知道先从哪一步骤开始,很多用户甚至不知道该怎么填写材料,所以我整理了一份详细的入网流程,以供大家参考,希望能帮助到大家~ 入…

eclipse CreateProcess error=87 的解决办法
有的说是 ClassPath过长,有的说是Eclipse插件导致最后 在这里得到解决啦http://code.google.com/p/googleappengine/issues/detail?id1862In C:\google\appengine-java-sdk-1.3.1\config\user\ant-macros.xmlChange line 102from<fileset dir"{war}/WEB-IN…

学习javascript 非常好的博客
这个大牛写的非常好!!推荐一下 http://www.cnblogs.com/xiaohuochai/tag/javascript%E6%80%BB%E7%BB%93/default.html?page8 小火柴的蓝色理想 转载于:https://www.cnblogs.com/oxspirt/p/7987342.html

Flex自定义组件
项目中需要用到如下一个效果。下图中五个圆代表一个五孔的梅花管。客户在后台操作时需要编辑梅花管的每个子孔占用情况。客户的要求是:点击某一个孔,小孔变黑,表明此孔被占用;再次点击,则小孔再变成透明圆形࿰…

解决在SQL Server 2000的存储过程不能调试
本机上: 控制面板—>管理工具—>服务—>MSSQL(默认的ID)—>属性—>登陆—>选一个Windows帐户,填写密码,再重新启动SQL Server 2000就可以调试存储过程了。 看一看sql数据库的版本,如果是kf版则不能进…
springboot打成jar后获取classpath下的文件
直接上代码 JAR包用这个 //获取容器资源解析器ResourcePatternResolver resolver new PathMatchingResourcePatternResolver();// 获取远程服务器IP和端口try {//获取所有匹配的文件Resource[] resources resolver.getResources("static/images/faceSearch/*.*"…