付费下载
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、【教学内容】Jdbc的快速入门事务的特点以及事务的隔离级别丢失更新自定义数据库连接池DBCP连接池,C3P0连接池,Tomcat内置DBCP连接池(JNDI连接池)什么【复习顺序】1.Jdbc程序去管理事务2.事务的特点以及事务的隔离级别3.C3P0连接池,4.Tomcat内置DBCP连接池(JNDI连接池)5.自定义数据库连接池【教学总结】【第一阶段】【目标:事务简介&mysql中事务管理】事务概念:围绕着一个业务功能,产生一组操作,这组操作要么全都成功,要么全都失败 ,这组操作称为一个事务 事务的典型案例:银行转账update account set money = money - 100
2、 where name=aaa;update account set money = money + 100 where name=bbb; 以上两条SQL 满足要么全部成功,要么全都失败 - 事务 举例:mysql中对事务管理1、创建account 数据表cmd net start mysql - 开启mysql服务create database day13;use day13;create table account( id int primary key auto_increment, name varchar(20), money double);insert into account
3、 values(null,aaa,1000);insert into account values(null,bbb,1000);insert into account values(null,ccc,1000);2、MySQL中事务默认自动提交的,每当执行一条SQL,就会提交一个事务 (一条SQL 就是一个事务)Oracle 中事务默认 不自动提交,需要在执行SQL 语句后 通过commint 手动提交事务 3、mysql管理事务同时事务管理SQL 语句 start transaction 开启事务rollback 回滚事务 (将数据恢复到事务开始时状态)commit 提交事务 (对事务中进
4、行操作,进行确认操作,事务在提交后,数据就不可恢复)【学习效果】 能够弄清楚什么叫做事务 弄清楚如何开启一个事务,回滚事务,提交事务,各个命令具体表示什么意思。【知识点过渡】接下来讲解如何采用jdbc程序去操作事务。【第二阶段】【目标:jdbc程序去操作事务】JDBC 中事务管理 JDBC编程步骤:装载驱动、建立连接、操作数据、关闭资源 JDBC控制事务语句Connection.setAutoCommit(false); / 相当于start transactionConnection.rollback(); rollbackCmit(); commitJDBC提供事务回滚点接口 Savepo
5、int, 如果在事务中进行savepoint设置,可以在事务回滚时,回滚到指定回滚点 举例:银行转账的例子例如,现在有个account 表,查询出来的 三个用户的money都是1000, 现在aaa 要想 bbb转 100 元钱。那么这个时候要使用事务去控制整个流程了。Testpublic void test1() Connection conn = null;Statement stmt = null;try conn = JdbcUtils.getConnection();/ 将 默认提交的设置给 关闭, 这样就 相当于 start transactionconn.setAutoCommi
6、t(false); stmt = conn.createStatement();stmt.executeUpdate(update account set money=money-100 where name=aaa);/ 执行过程中出现了异常int i = 1/0;stmt.executeUpdate(update account set money=money+100 where name=bbb);/如果没有出现异常要提交事务mit(); / 如果出现了异常,则将其放大到最大,这样所有的异常都捕获。 catch (Exception e) try / 如果出现了异常要回滚。 conn.r
7、ollback(); catch (SQLException e1) e1.printStackTrace();e.printStackTrace();finallyJdbcUtils.release(stmt, conn);JDBC提供事务回滚点接口 Savepoint, 如果在事务中进行savepoint设置,可以在事务回滚时,回滚到指定回滚点 。案例:模拟用户转账,ccc找bbb借钱,但是现在bbb没钱,bbb就找aaa借钱了之后,再借给ccc,在这个案例中,就涉及到设置回滚点。具体的请参看课堂代码。 【学习效果】掌握在jdbc中如何去控制事务。掌握savepoint可以用来设置回滚点。
8、 【知识点过渡】事务的特点以及事务的隔离级别。【第三阶段】 【目标:事务的特点以及事务的隔离级别】事务的四大特性 : ACID 原子性、一致性、隔离性、持久性1、原子性:事务中操作不可分割,要么都成功、要么都失败 2、一致性:事务操作,必须保证数据完整性一致 ,例如:删除一个公司部门的数据,包括部门基本信息、部门人力信息、财务信息 ,如果财务信息依赖部门基本 信息,删除时,保证删除之前财务信息依赖基本信息,删除后,部门基本信息和财务信息同时删除,如果只删除基本信息,部门财务信息依赖数据丢失,破坏数据的一致性 3、隔离性:多个事务同时操作一条数据记录,事务之间应该相互隔离,不互相影响 4、持久性
9、:事务一旦提交后,数据将永久改变,不能恢复 如果数据库不考虑并发线程 事务访问的隔离,将引发哪些问题?1、脏读 : 一个事务读取另一个事务未提交的数据 A 转账 给B 100,未提交B 查询账户多了100A 回滚B 查询账户那100不见了 2、不可重复读:在一个事务先后两次读取发生数据不一致情况,第二次读取到另一个事务已经提交数据 (强调数据更新 update)A 查询账户 5000B 向 A 账户转入 5000 A 查询账户 10000 3、虚读 : 在一个事务中,第二次读取发生数据记录数的不同 ,读取到另一个事务已经提交数据 (强调数据记录变化 insert ),虚读的发生一般是有概率的。
10、A 第一次读取 存在5条记录B 向 A 插入一条新的记录A 第二次读取 存在6条记录 数据库内部定义了四种隔离级别,用于解决三种隔离问题1、read uncommited 最低事务级别,允许以上三类隔离问题的发生 2、read committed 不会发生脏读,允许不可重复读和虚读发生3、repeatable read 不会发生脏读、不可重复读,允许虚读发生4、serializable 事务最高级别,所有相同数据事务操作,都会串行进行,不存在并发,不存在三类隔离问题 操作数据库内部隔离级别set session transaction isolation level 设置事务隔离级别selec
11、t tx_isolation查询当前事务隔离级别实验一:演示脏读发生 在A窗口 将隔离级别设置 read uncommitted A、B窗口同时开启事务 B窗口执行转账操作 update account set money = money - 500 where name=bbb;update account set money = money + 500 where name =aaa; 未提交事务A窗口查询 select * from account; 查询到转账结果(脏读)B 回滚 rollback A窗口查询 金钱丢失实验二:演示不可重复读在A窗口设置 隔离级别 read commit
12、ted; 重复实验一,发现无法脏读B窗口转账后,提交事务 A窗口查询到 B提交的数据 (不可重复读)实验三:演示阻止不可重复读发生在A窗口 设置隔离级别 repeatable read 重复试验二,发现不会发生不可重复读实验四:演示serializable 串行事务效果A窗口设置隔离级别 serializable A、B同时开启事务B窗口插入一条数据 insert into account values(null,ddd,1000);在A窗口查询数据 select * from account; 发现A 窗口阻塞了,等待B事务执行结束安全性:serializable repeatable re
13、ad read committed read uncommitted 性能 :serializable repeatable read read committed read uncommitted 结论: 实际开发中,通常不会选择 serializable 和 read uncommitted , mysql默认隔离级别 repeatable read ,oracle默认隔离级别 read committedJDBC程序中能否指定事务的隔离级别 ?Connection接口中定义事务隔离级别四个常量:static int TRANSACTION_READ_COMMITTED 指示不可以发生脏读
14、的常量;不可重复读和虚读可以发生。 static int TRANSACTION_READ_UNCOMMITTED 指示可以发生脏读 (dirty read)、不可重复读和虚读 (phantom read) 的常量。 static int TRANSACTION_REPEATABLE_READ 指示不可以发生脏读和不可重复读的常量;虚读可以发生。 static int TRANSACTION_SERIALIZABLE 指示不可以发生脏读、不可重复读和虚读的常量。 通过 void setTransactionIsolation(int level) 设置数据库隔离级别 【学习效果】了解事务的4大
15、特性。了解发生线程安全问题时会出现的几类情况。掌握在数据库中如何解决线程安全的问题。掌握四种隔离级别下会产生什么样的问题,以及如何解决。 【知识点过渡】接下来讲解丢失更新的问题。【第四阶段】 【目标:丢失更新】事务的企业开发中常见问题:lost update 丢失更新描述:两个事务同时更新同一行数据,第二个事务提交数据,覆盖了第一个事务提交更新数据丢失更新问题丢失更新问题解决方案:方案一:悲观锁 (假设丢失更新一定会发生 ) - 利用数据库内部锁机制,管理事务方案二:乐观锁 (假设丢失更新不会发生)- 采用程序中添加版本字段解决丢失更新问题一、悲观锁- 假设丢失更新一定会发生。mysql数据库
16、内部提供两种常用 锁机制:共享锁(读锁)和排它锁(写锁)允许一张数据表中数据记录,添加多个共享锁,添加共享锁记录,对于其他事务可读不可写的 一张数据表中数据记录,只能添加一个排它锁,在添加排它锁的数据 不能再添加其他共享锁和排它锁的 ,对于其他事物可读不可写的 * 所有数据记录修改操作,自动为数据添加排它锁 添加共享锁方式:select * from account lock in share mode ;添加排它锁方式:select * from account for update; * 锁必须在事务中添加 ,如果事务结束了 锁就释放了 解决丢失更新:事务在修改记录过程中,锁定记录,别的事
17、务无法并发修改 悲观锁解决丢失更新问题悲观锁解决丢失更新问题排他锁二、乐观锁- 假设丢失不会发生。采用记录的版本字段,来判断记录是否修改过 - timestamp timestamp 可以自动更新create table product ( id int, name varchar(20), updatetime timestamp);insert into product values(1,冰箱,null);update product set name=洗衣机 where id = 1;* timestamp 在插入和修改时 都会自动更新为当前时间 解决丢失更新:在数据表添加版本字段,每次
18、修改过记录后,版本字段都会更新,如果读取是版本字段,与修改时版本字段不一致,说明别人进行修改过数据 (重改)乐观锁解决丢失更新问题乐观锁解决丢失更新问题 【学习效果】了解什么是丢失更新。了解悲观锁是如何解决丢失更新的问题。了解乐观锁是如何解决丢失更新的问题。 【知识点过渡】接下来讲解数据库连接池技术。【第五阶段】【目标:数据库连接池技术】数据库连接池原理:一次性创建多个连接,将多个连接缓存在内存中 ,形成数据库连接池(内存数据库连接集合),如果应用程序需要操作数据库,只需要从连接池中获取一个连接,使用后,并不需要关闭连接,只需要将连接放回到连接池中。* 好处:节省创建连接与释放连接 性能消耗
19、- 连接池中连接起到复用的作用 ,提供程序性能如图:JDBC定义 javax.sql.DataSource 数据库连接池接口,只需要实现该接口,就可以去定义数据库连接池 编写实现连接池注意事项:1、一次性批量创建多个数据库连接,保存集合对象中 - 就是连接池2、实现DataSource接口中 getConnection , 从连接池中取出连接 3、在用户使用连接后,能够将连接放回到连接池 自定义连接池程序问题:1、尽量不要使用具体对象类型的引用 MyDataSource dataSource = new MyDataSource(); 应该写为 DataSource dataSource =
20、new MyDataSource();2、使用自定义方法 addBackToDBPool 将连接放回连接池 ,需要用户在使用时需要记忆额外API 解决:让用户定义连接池时 DataSource dataSource = new MyDataSource(); 在用户使用连接后,应该调用conn.close(); 完成将连接放回到连接池 对close方法进行方法增强 练习:增强close方法,不真正关闭连接,而是将连接放回到连接池 增强java中一个方法存在三种方式:1、继承 方法覆盖 2、包装 3、动态代理1、继承方法覆盖,对原有类方法进行加强 注意:必须控制对象构造,才能使用继承的方式对方法
21、进行加强2、包装 (装饰者)编写包装类 必须要与被装饰对象,有相同父类或者实现相同接口 2) 必须将被装饰对象传递给装饰者 (构造函数)包装是一种通用方法加强措施,不管是否控制目标对象创建,都可以完成方法加强3、动态代理 原理:利用类加载器 ,在内存中根据目标类的加载器和接口 创建一个代理对象 ,通过代理对象完成对原有对象方法进行加强注意:被代理对象,必须实现接口 应用场景:也是只要存在目标对象,就可以通过动态代理进行加强 JDK中反射包中的 类 Proxy类用于实现获得一个真实业务对象的代理对象。【学习效果】能够弄清楚数据库连接池的概念,添加了数据库连接池后好处在哪里。了解对对自定义的数据库
22、连接池进行close加强的几种方式。【知识点过渡】接下来讲解常见的开源数据库连接池。【第六阶段】【目标:常用开源连接池】常用的开源连接池有:1、Apache DBCP2、C3P03、Tomcat内置连接池 一、DBCP 连接池DBCP 是Apache 的commons 项目的一个子项目 去官网下载 dbcp 和 pool 的jar包 ,DBCP 依赖 POOL的jar包 复制两个jar 到WEB-INF/lib下 DBCP连接池 核心类 BasicDataSource * 任何数据库连接池,需要数据库连接,必须通过JDBC四个基本参数构造 方式一:手动设置参数 / 使用连接池BasicData
23、Source basicDataSource = new BasicDataSource();/ 设置JDBC四个基本参数basicDataSource.setDriverClassName(com.mysql.jdbc.Driver);basicDataSource.setUrl(jdbc:mysql:/day12);basicDataSource.setUsername(root);basicDataSource.setPassword(abc);方式二:通过配置文件/ 根据属性参数 获得连接池InputStream in = DBCPTest.class.getResourceAsStr
24、eam(/perties);Properties properties = new Properties();/ 装载输入流properties.load(in);DataSource dataSource = BasicDataSourceFactory.createDataSource(properties);二、C3P0 连接池 主流开源连接池,在Hibernate和Spring 都提供对C3P0连接池支持去下载c3p0 开发包 将c3p0的jar 复制WEB-INF/lib下 方式一:手动 / 核心连接池类ComboPooledDataSource comboPooledDataSou
25、rce = new ComboPooledDataSource();/ 设置四个JDBC基本连接属性comboPooledDataSource.setDriverClass(com.mysql.jdbc.Driver);comboPooledDataSource.setJdbcUrl(jdbc:mysql:/day12);comboPooledDataSource.setUser(root);comboPooledDataSource.setPassword(abc);方式二:在src下新建c3p0-config.xml ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource(); 会自动加载配置文件 常用基本连接池属性 acquireIncrement 如果连接池中连接都被使用了,一次性增长3个新的连接 initialPoolSize 连接池中初始化连接数量 默认:3 maxPoolS
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年烟台文化旅游职业学院辅导员考试笔试真题汇编附答案
- 2024年长治职业技术学院辅导员招聘考试真题汇编附答案
- 2024年青海省联合职工大学辅导员考试笔试题库附答案
- 2024年黑龙江工程学院昆仑旅游学院辅导员考试笔试题库附答案
- 2025上海华东师范大学地缘战略研究院科研助理招聘1人参考题库附答案
- 2025中原农业保险股份有限公司招聘67人备考题库及答案1套
- 2025中国资本市场学会中高层次人才引进(上海)备考题库附答案
- 2025年商丘睢县消防救援大队公开招录11名政府专职消防员参考题库附答案
- 2025年安徽林业职业技术学院辅导员招聘考试真题汇编附答案
- 2025年度上饶市广信区公安局招聘编制外聘用人员25人备考题库附答案
- 化工厂班组安全培训课件
- 2025四川成都农商银行招聘10人笔试备考题库及答案解析
- 营业执照借用协议合同
- 2025年秋苏教版(新教材)初中生物八年级上册期末知识点复习卷及答案(共三套)
- 2025年小升初学校家长面试题库及答案
- 2025年法考客观题真题回忆版(含答案)
- 2025年危化品泄漏应急培训教案
- 2026年铁岭卫生职业学院单招职业技能测试题库附答案详解
- 2025年江南大学招聘真题(行政管理岗)
- 2024-2025学年江苏省南通市海门区高二上学期期末调研地理试题(解析版)
- 汽车焊接知识培训
评论
0/150
提交评论