JDBC4-JDBC高级特性2(事务,并发控制,行集)(2)_第1页
JDBC4-JDBC高级特性2(事务,并发控制,行集)(2)_第2页
JDBC4-JDBC高级特性2(事务,并发控制,行集)(2)_第3页
JDBC4-JDBC高级特性2(事务,并发控制,行集)(2)_第4页
JDBC4-JDBC高级特性2(事务,并发控制,行集)(2)_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第四章第四章:JDBC高级特性高级特性2-事务,并发控制,行集事务,并发控制,行集本章内容本章内容l事务事务l并发控制并发控制lRow set(行集行集)lJDBC异常与警告异常与警告事务事务银行转账问题银行转账问题l张三将张三将1000元钱转到李四的账号,程序处理需要的步骤:元钱转到李四的账号,程序处理需要的步骤:n1、张三的账号减掉、张三的账号减掉1000元;元;n2、李四的账号增加、李四的账号增加1000元;元;n3、转账过程记录;、转账过程记录;n只有三个步骤全部正确完成转账才算成功。只有三个步骤全部正确完成转账才算成功。l但是程序在实际运行时,执行完步骤但是程序在实际运行时,执行完步

2、骤1后,程序出现错误后,程序出现错误导致步骤导致步骤2和步骤和步骤3无法顺利执行:无法顺利执行:n张三的钱少了张三的钱少了1000元;元;n李四的钱没变;李四的钱没变;n1000元去了哪里?元去了哪里?事务事务(1/3)l数据库:默认情下,数据库:默认情下,JDBC的每个数据操作的每个数据操作SQL语句都是自语句都是自动提交,每个语句分开单独执行动提交,每个语句分开单独执行l银行转账问题:需要多次数据操作才能完成银行转账问题:需要多次数据操作才能完成l可能产生的问题可能产生的问题n需要多次数据操作才能完成的业务无法完成,数据不一致需要多次数据操作才能完成的业务无法完成,数据不一致l解决办法解决

3、办法银行转账问题:将完成转账功能的所有数据操作放在一起作为一个银行转账问题:将完成转账功能的所有数据操作放在一起作为一个整体执行,要么全部都执行成功,要么全部恢复整体执行,要么全部都执行成功,要么全部恢复事务事务(2/3)l事务是指一个工作单元,它包含了一组添加,删除,修改等事务是指一个工作单元,它包含了一组添加,删除,修改等数据操作命令,这组命令作为一个整体向系统提交执行,要数据操作命令,这组命令作为一个整体向系统提交执行,要么都执行成功,要么全部恢复么都执行成功,要么全部恢复l在在JDBC中使用事务中使用事务con.setAutoCommit(false),取消自动提交,取消自动提交对数据

4、库执行一个或多个操作对数据库执行一个或多个操作(一个或多个一个或多个SQL语句语句)mit(),提交事务,提交事务(上面的第二部的多个操作就作为一个整上面的第二部的多个操作就作为一个整体提交执行体提交执行)如果某个操作失败,通过如果某个操作失败,通过con.rollback()回滚所有操作回滚所有操作(撤销以上的撤销以上的操作,将数据恢复为执行前状态操作,将数据恢复为执行前状态)l事务处理依赖于底层的数据库实现,不同的驱动程序对事务事务处理依赖于底层的数据库实现,不同的驱动程序对事务处理的支持程度可能不同处理的支持程度可能不同事务事务(3/3)l语法语法Connection con = Dri

5、verManger.getConnection(urlString);con.setAutoCommit(false);Statement stm = con.createStatement();stm.executeUpdate(sqlString);con.transactionEndMethod; /mit() or con.rollback();l示例示例:try con.setAutoCommit(false); stm = con.createStatement(); stm.executeUpdate( “insert into t_user(id, name, password

6、) values(1, admin,admin )”); mit(); 数据操作代码数据操作代码mit(); catch(SQLException e) try con.rollback(); catch(Exception e) 本章内容本章内容l事务事务l并发控制并发控制lRow set(行集行集)lJDBC异常与警告异常与警告数据库并发数据库并发l数据库并发就是不同的事务对同一部分数据执行操作数据库并发就是不同的事务对同一部分数据执行操作 事务事务T1和和T2(或多个事务或多个事务)对同一部分数据进行改,删,查操作:对同一部分数据进行改,删,查操作:T1 进行修改而进行修改而T2进行查询

7、。进行查询。l数据库并发容易导致的问题数据库并发容易导致的问题读脏数据:事务读脏数据:事务T1修改某一数据,并将其写回数据库,事务修改某一数据,并将其写回数据库,事务T2读取读取同一数据后,同一数据后,T1由于某种原因被撤消,这时由于某种原因被撤消,这时T1已修改过的数据恢复已修改过的数据恢复原值,原值,T2读到的数据就与数据库中的数据不一致,我们称读到的数据就与数据库中的数据不一致,我们称T2读到的读到的数据就为数据就为脏脏数据,即不正确的数据。数据,即不正确的数据。不可重复读:不可重复读是指事务不可重复读:不可重复读是指事务T1读取数据后,事务读取数据后,事务T2执行更新执行更新操作,使操

8、作,使T1无法再现前一次读取结果。无法再现前一次读取结果。幻读:事务幻读:事务T1按一定条件从数据库中读取某些数据记录后,事务按一定条件从数据库中读取某些数据记录后,事务T2插入了一些记录,当插入了一些记录,当T1再次按相同条件读取数据时,发现多了一些再次按相同条件读取数据时,发现多了一些记录。记录。并发控制并发控制(1/3)l数据库并发控制就是要用正确的方式调度并发操作,使一数据库并发控制就是要用正确的方式调度并发操作,使一个用户事务的执行不受其它事务的干扰,从而避免造成数据个用户事务的执行不受其它事务的干扰,从而避免造成数据的不一致的不一致l在在JDBC中,通过中,通过connection

9、可以设置事务隔离级别来对可以设置事务隔离级别来对并发进行控制并发进行控制事务隔离级别就是事务执行时受打扰的程度,不同隔离级别对应不同事务隔离级别就是事务执行时受打扰的程度,不同隔离级别对应不同的干扰程度,隔离级别越高,数据一致性就越好,但并发性越差,效率的干扰程度,隔离级别越高,数据一致性就越好,但并发性越差,效率越低。越低。并发控制并发控制(2/3)lConnection中查看和设置隔离级别的方法中查看和设置隔离级别的方法getTransactionIsolation():查看隔离级别:查看隔离级别setTransactionIsolation(int level):设置隔离级别:设置隔离级

10、别lConnection中的事务隔离级别中的事务隔离级别(Connection接口中的常量接口中的常量)TRANSACTION_NONE:此级别不支持事务:此级别不支持事务TRANSACTION_READ_UNCOMMITTED:此级别允许某一事务读其他事务:此级别允许某一事务读其他事务还没有更改完的数据。允许发生脏读还没有更改完的数据。允许发生脏读 、不可重复读和幻读。、不可重复读和幻读。TRANSACTION_READ_COMMITTED:此级别要求某一事务只能等别的事务:此级别要求某一事务只能等别的事务全部更改完才能读。可以防止发生脏读,但不可重复读和幻读有可能发生。全部更改完才能读。可

11、以防止发生脏读,但不可重复读和幻读有可能发生。TRANSACTION_REPEATABLE_READ:此级别要求某一事务只能等别的事:此级别要求某一事务只能等别的事务全部更改完才能读而且禁止不可重复读。也就是可以防止脏读和不可重复读务全部更改完才能读而且禁止不可重复读。也就是可以防止脏读和不可重复读,但幻读有可能发生。,但幻读有可能发生。TRANSACTION_SERIALIZABLE:此级别防止发生脏读、不可重复读和幻读:此级别防止发生脏读、不可重复读和幻读,事务只能一个接着一个地执行,而不能并发执行。,事务只能一个接着一个地执行,而不能并发执行。并发控制并发控制(3/3)l语法语法con.

12、setTransactionIsolation(Connection.isolationLevel);l示例示例:Connection con = DriverManager.getConnection(“jdbc:mysql:/localhost:3306/test”, “root”, “root”);con.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);。本章内容本章内容l事务事务l并发控制并发控制lRow set(行集行集)lJDBC异常与警告异常与警告行集行集(Row Set)l行集是从表格式数据源中检索出

13、来的一行或多行数据行集是从表格式数据源中检索出来的一行或多行数据与结果集与结果集(ResultSet)类似类似(RowSet接口继承了接口继承了ResultSet接口接口)但是使用结果集时与数据库的连接不能断开,而行集是可以在关闭连接但是使用结果集时与数据库的连接不能断开,而行集是可以在关闭连接的情况下存在的,行集一般在关闭连接的情况下使用,只有在进行一些的情况下存在的,行集一般在关闭连接的情况下使用,只有在进行一些特殊操作时需要才建立连接特殊操作时需要才建立连接l行集中的数据来源行集中的数据来源使用使用JDBC驱动程序从数据库检索的数据驱动程序从数据库检索的数据从其他数据源获得的数据,如文件

14、数据从其他数据源获得的数据,如文件数据行集行集(Row Set)的优点的优点l可以断开数据库连接操作数据可以断开数据库连接操作数据l可以在分布式系统中的不同组件之间传递可以在分布式系统中的不同组件之间传递l默认可更新,可滚动,可序列化,可以方便的在网络间传输默认可更新,可滚动,可序列化,可以方便的在网络间传输l可以方便的使数据在行集与可以方便的使数据在行集与JavaBean对象之间进行转换对象之间进行转换行集中的一行数据可以封装为一个行集中的一行数据可以封装为一个JavaBean对象对象JavaBean是一个类,类中有若干私有属性,然后有与属性相关的公有是一个类,类中有若干私有属性,然后有与属

15、性相关的公有的的get和和set方法。这样,我们可以将一行数据存入一个方法。这样,我们可以将一行数据存入一个JavaBean对象中对象中行集相关接口行集相关接口l行集相关接口行集相关接口javax.sql.RowSet:所有行集的父接口:所有行集的父接口java.sql.rowset.CachedRowSet:数据行容器,可以在内存中缓存各:数据行容器,可以在内存中缓存各行数据,在对数据进行操作时不需要连接到数据源。可以修改行数据,在对数据进行操作时不需要连接到数据源。可以修改CachedRowSet对象中的数据,这些修改随后可以被更新到数据库。对象中的数据,这些修改随后可以被更新到数据库。同

16、时,也是一个同时,也是一个JavaBean组件,可滚动,可更新,可序列化。组件,可滚动,可更新,可序列化。java.sql.rowset.JDBCRowSet:数据行容器,可滚动,可更新。始终:数据行容器,可滚动,可更新。始终连接到数据库。连接到数据库。java.sql.rowset.WebRowSet:被缓存的行集,该行集数据可以保存:被缓存的行集,该行集数据可以保存为为xml文件。文件。java.sql.rowset.JoinRowSet:数据行容器,这些数据取自那些形成:数据行容器,这些数据取自那些形成SQL JOIN关系的关系的RowSet对象,有连接和无连接的对象,有连接和无连接的R

17、owSet对象都可成对象都可成为为JOIN的一部分。的一部分。java.sql.rowset.FilteredRowSet:数据行容器,可以对数据进行条件:数据行容器,可以对数据进行条件过滤。过滤。行集的填充行集的填充(1/2)l由驱动或厂商实现相关接口得到可以使用的行集类由驱动或厂商实现相关接口得到可以使用的行集类我们演示中使用的是我们演示中使用的是SUN的默认实现类的默认实现类l传统传统JDBC方式方式Class.forName(“com.mysql.jdbc.Driver”); String connectionUrl = “jdbc:mysql:/localhost:3306/test

18、?user=root&password=root ; Connection connection = DriverManager.getConnection(connectionUrl);Statement statement = connection.createStatement();ResultSet rs = statement.executeQuery(sql);CachedRowSetImpl rowset = new CachedRowSetImpl();rowset.populate(rs); rs.close(); statement.close();connecti

19、on.close();行集的填充行集的填充(2/2)l设置行集属性连接数据库并检索数据设置行集属性连接数据库并检索数据CachedRowSetImpl rowset = new CachedRowSetImpl();rowset.setUrl(“jdbc:mysql:/127.0.0.1:3306/test”);rowset.setUsername(“root”);rowset.setPassword(“test”);rowset.setCommand(“select * from student”);rowset.execute();l其他的填充方式:其他的填充方式:XMLExcelRowS

20、et的使用的使用(1/5)以下行集类使用以下行集类使用Java的默认实现类的默认实现类CachedRowSetImpl rowset = new CachedRowSetImpl(); /CachedRowSetImpl是是SUN定义的定义的CachedRow接口默认实现类接口默认实现类Statement statement = connection.createStatement();ResultSet rs = statement.executeQuery(“select * from table1”);rowset.populate(rs); /填充行集填充行集rs.close(); s

21、tatement.close();connection.close(); /关闭连接关闭连接/显示显示CachedRow数据,使用从结果集继承的方法数据,使用从结果集继承的方法while (rowset.next() System.out.print(rowset.getString(1) + : ); System.out.println(rowset.getString(CompanyName); RowSet的使用的使用(2/5)/更新更新CachedRow数据数据(conn.setAutoCommit(false);)crs.last();crs.updateShort(3, 58);

22、crs.updateInt(4, 150000);crs.updateRow(); /更新行集更新行集crs.acceptChanges(conn); /更新数据库更新数据库 注意事项:注意事项:使用行集修改数据与行集中的数据填充方式无关。但是要保证使用行集修改数据与行集中的数据填充方式无关。但是要保证acceptChanges()方法执行时有可用的连接对象,如果行集中方法执行时有可用的连接对象,如果行集中有可用的连接对象可以调用有可用的连接对象可以调用acceptChanges(),如果行集中没,如果行集中没有可用的连接对象,需要调用有可用的连接对象,需要调用acceptChanges(Co

23、nnection)方法。方法。使用行集使用行集对数据进行添加、修改、删除时,必须保证事务提交对数据进行添加、修改、删除时,必须保证事务提交为非自动提交为非自动提交(acceptChanges()方法会调用方法会调用commit()方法方法)。RowSet的使用的使用(3/5)/添加数据添加数据crs.setTableName(“student”); /添加数据必须指定添加数据必须指定crs.moveToInsertRow(); /标识指针的位置标识指针的位置crs.updateInt(“id”,33); /添加数据时主键必须指定添加数据时主键必须指定crs.updateString(“name

24、, Shakespeare);crs.updateShort(“age, 58);crs.insertRow(); /更新行集更新行集crs.moveToCurrentRow(); /让指针回到标识的位置让指针回到标识的位置crs.acceptChanges(conn); /更新数据库更新数据库/删除数据删除数据crs.first();crs.deleteRow(); /删除行集数据删除行集数据crs.acceptChanges(conn); /更新数据库更新数据库RowSet的使用的使用(4/5)/分页分页1:使用结果集填充行集:使用结果集填充行集rs = stm.executeQuery(

25、“select * from student”);crs.setPageSize(4); /设置每页行数设置每页行数crs.populate(rs, 10); /从结果集的第十行开始取从结果集的第十行开始取4行数据填充行集行数据填充行集crs.nextPage(); /获得后续页数据,如果有数据返回获得后续页数据,如果有数据返回true注意:注意:此时此时resultset,statement(preparedstatement),connection不能关闭,不能关闭,否则行集无法取得后续页数据否则行集无法取得后续页数据RowSet的使用的使用(5/5)/分页分页2:行集建立连接从数据库读取

26、数据:行集建立连接从数据库读取数据CachedRowSetImpl crs= new CachedRowSetImpl();crs.setUrl(“jdbc:mysql:/127.0.0.1:3306/test”);crs.setUsername(“root”);crs.setPassword(“root”);crs.setCommand(“select * from student”);crs.setPageSize(4); /每页行数,一定要在每页行数,一定要在execute()方法执行前设置,否则无效方法执行前设置,否则无效crs.execute();crs.nextPage(); /获

27、得下一页的数据,与结果集,连接对象无关获得下一页的数据,与结果集,连接对象无关行集的事件行集的事件l行集支持事件,当行集中的数据发生变化时就会触发相关行集支持事件,当行集中的数据发生变化时就会触发相关事件,从而可以通知使用行集的对象事件,从而可以通知使用行集的对象l当行集数据发生变化时获得通知的对象需要实现当行集数据发生变化时获得通知的对象需要实现RowSetListener接口成为事件侦听器并在行集对象中注册接口成为事件侦听器并在行集对象中注册l事件侦听器注册使用事件侦听器注册使用addRowSetListener()方法方法crs.addRowSetListener(事件侦听器对象事件侦听器对象);l行集可以生成三种类型的事件行集可以生成三种类型的事件游标移动事件游标移动事件一行数据改变事件一行数据改变事件数据全部改变事件数

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论