一.事务(Transaction) 原子操作:不可再分的操作,一个操作不能再分成比它更细小的操作. 事务是针对原子操作的,要求原子操作不可再分,并且必须同时成功同时失败。 事务就是把一些非原子操作,变成原子操作,由应用服务器来提出要求,由数据库服务器来执行操作. 在JDBC中默认是自动提交的,如果要想使用事务,需要按以下步骤执行: 1.要调用con.setAutoCommite(false)方法,把自动提交(commit)置为false。 2.进行正常的数据库操作 3.如果操作成功了可以选择con.commit(),或者操作失败时选择con.roolback(); 注意:打开事务就要关闭自动提交,当不需要再使用事务的时候调用setAutoCommite(true).
二.事务并发产生的问题 三种并发产生的后果: 1,脏读:一个事务读取到了另外一个事务没有提交的数据。 2,重复读:一个事务读取到了另外一个事务提交的数据。它是要保持在同一时间点上读取到的数据相同,希望在一段时间内的数据是不变的。 3,幻读:一个事务读取到了另外一个事务提交的数据。用同样的操作读取两次,得到的记录数不相同。 三.事务隔离级别 五种控制级别: TRANSACTION_NONE不使用事务。 TRANSACTION_READ_UNCOMMITTED 允许脏读。 TRANSACTION_READ_COMMITTED防止脏读,最常用的隔离级别,并且是大多数数据库的默认隔离级别 TRANSACTION_REPEATABLE_READ可以防止脏读和不可重复读, TRANSACTION_SERIALIZABLE可以防止脏读,不可重复读取和幻读,(事务串行化)会降低数据库的效率 以上的五个事务隔离级别都是在Connection类中定义的静态常量,使用setTransactionIsolation(int level) 方法可以设置事务隔离级别。 如:con.setTransactionIsolation(Connection.REPEATABLE_READ); 四.JDBC2.0新特性 1.可滚动特性和可更新特性 JDBC1.0中是指游标的移动的方向和方式是单向,单步(相对)移动,功能比较简单. JDBC2.0中游标可以双向,相对或者绝对移动. 可滚动结果集:这种结果集不但可以双向滚动,相对定位,绝对定位,并且还可以修改数据信息。 1)滚动特性 定位函数: boolean absolute(int row),定位到指定的记录位置。定位成功返回true,不成功返回false。 void afterLast() ,把游标移动到最后一条记录的后面(逻辑位置)。 void beforeFirst() ,把游标移动到第一条记录的前面(逻辑位置)。 //由于第一条记录的前面和最后一条记录的后面这两个位置肯定存在,所以无需判断是否存在,返回值设为void. boolean first(),把游标定位到第一条记录。 boolean last(),把游标定位到最后一条记录。 //当结果集为空的时候,这两个方法会返回false. boolean next(),此方法是使游标向下一条记录移动。 boolean previous() ,此方法可以使游标向上一条记录移动,前提是前面还有记录。 boolean relative(int rows) ,相对定位方法,参数值可正可负,参数为正,游标从当前位置向后移动指定值条记录,参数为负,游标从当前位置向前移动指定值条记录。 判断函数: ifBeforeFirst()判断是否在在第一条记录之前. ifAfterLast()判断是否在在最后一条记录之后. ifFirst()判断是否为第一条记录. ifLast()判断是否为最后一条记录. 要使用可滚动结果集时,需要一次设置更新特性与滚动特性,不能分开. 1.更新特性常量: CONCUR_READ_ONLY 只读结果集(默认) CONCUR_UPDATABLE 可更新结果集 2.滚动特性常量: TYPE_FORWARD_ONLY ,该常量表示指针只能向前移动的 ResultSet 对象的类型。(默认) TYPE_SCROLL_INSENSITIVE ,该常量指示可滚动但通常不受其他更改影响的 ResultSet 对象的类型。 TYPE_SCROLL_SENSITIVE ,该常量指示可滚动并且通常受其他更改影响的 ResultSet 对象的类型。 //敏感:数据库改变,结果集改变. 语法: Statement st=null; st=con.createStatement(ReusltSet.TYPE_SCROLL_INSENSITIVE,ResuleSet.CONCUR_UPDATABLE) 在创建Statement的时候就要指定这两个参数,使用Statement,第一个参数代表滚动特性常量,第二个代表更新特性常量 2)可更新特性 a.moveToInsertRow();记录当前游标位置,将游标移到和结果集结构类似的缓冲区; b.使用updateXxx(int column,columnType value)方法来更新指定列数据; c.使用insertRow() 方法插入记录; d.将游标指回原位,moveToCurrentRow() 。 能否使用JDBC2.0 ResultSet的新特性,要看使用的数据库驱动是否支持. 还有只能用于单表且表中有主键字段(可能会是联合主键),不能够有表连接,会取 可更新操作必须满足以下条件: a.查询只能引用一张表. b.不能包含任何连接操作. c.必须把完整的主键查到结果集里面; d.保证所有字段为非空字段并且没有默认值。 五.数据库元数据: DatabaseMetaData dbmd = con.getMetaData();//得到数据库元数据 dbmd.supportsResultSetConcurrency(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_UPDATABLE);//判断是否支持可更新操作 六.批量更新 优势: 1.节省传递时间 2.并发处理 PreparedStatement: 1.addBatch() 将一组参数添加到 PreparedStatement对象内部 2.executeBatch() 将一批参数提交给数据库来执行,如果全部命令执行成功,则返回更新计数组成的数组。 Statement: addBatch(String sql)方法会在批处理缓存中加入一条sql语句 executeBatch()执行批处理缓存中的所有sql语句。 注意:PreparedStatement中使用批量更新时,要先设置好参数后再使用addBatch()方法加入缓存。 批量更新中只能使用更新或插入语句 七.SQL3中的数据类型 Array:数组 Sturct:结构 大对象: Blob:大的二进制数据文件对象。 Clob:大的文本文件对象。 优点: 1.理论上大小没有上限,受制于数据库表空间的大小. 2.流式读取. 使用大对象的步骤: 1.先插入一个空的占位对象empty_blob()(oracle的函数):insert into t_blob values(?,?,empty_blob()); 2.获得大对象:select blob_data from t_blob where name = ? for update; 3.获取流进行写入:blob.setBinaryStream(0); 4.通过流来获取blob中存储的数据:blob.getBinaryStream() |