一、存储过程
1、用当地数据库语言,写的一段业务逻辑算法,并该算法存储在客户端。
2、使用存储过程需要用于CallableStatement接口,调用代码:
CallableStatementcStmt = conn.prepareCall("{call demoSp(?, ?)}");
3、对于存储过程的输出参数,需要注册:cstmt.registerOutParameter(3,Types.INTEGER);
4、取得返回值时,需要按照输出参数的位置来取。
5、案例如下:
1)MySql存储过程代码:
drop procedure add_pro; delimiter // create procedure add_pro(a int,b int,out sum int) begin set sum = a + b; end; // delimiter ;
2)调用存储过程代码:
package com.gnnuit.web.demo; import java.sql.CallableStatement; import java.sql.Connection; import java.sql.ResultSet; import java.sql.Types; import com.gnnuit.web.util.JdbcUtill; public class Demo1 { public static void main(String[] args) { Connection conn = null; CallableStatement cstmt = null; ResultSet rs = null; try { conn = JdbcUtill.getMySqlConnection(); cstmt = conn.prepareCall("{call add_pro(?,?,?)}"); cstmt.setInt(1, 100); cstmt.setInt(2, 200); cstmt.registerOutParameter(3, Types.INTEGER); cstmt.execute(); System.out.println(cstmt.getInt(3)); } catch (Exception e) { e.printStackTrace(); } finally { JdbcUtill.close(rs); JdbcUtill.close(cstmt); JdbcUtill.close(conn); } } }
二、事务
1、每种数据库都有事务的支持,但支持强度不同。
2、以MySQL为例:
启动事务:start transaction;
提交事务:commit;
回滚事务:rollback;
3、在事务范围内回滚是允许的,但如果commit后再回滚,无效
4、其实每条SQL都有事务存在,只是显示还隐藏而言,默认都是隐藏事务
5、事务的操作,必须争对同一个Connection。
6、事务的操作,可以设置一个回滚点,便于回滚到最近的回滚点处。
三、事务的特性
1、原子性(Atomicity)
原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
2、一致性(Consistency)
事务必须使数据库从一个一致性状态变换到另外一个一致性状态。
3、隔离性(Isolation)
事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。
4、持久性(Durability)
持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。
四、违背隔离性的三个缺点
1、脏读:一个线程看到了另一个线程未提交的数据,叫脏读。
2、不可重复读:一个线程多次做查询操作,多次结果都不一致,叫不可重复读。
3、幻读/虚读:是指在一个事务内读取到了别的事务插入的数据,导致前后读取不一致。
五、事务的隔离级别
1、Serializable:可避免脏读、不可重复读、虚读情况的发生。(串行化)
2、Repeatable read:可避免脏读、不可重复读情况的发生。(可重复读)
3、Read committed:可避免脏读情况发生(读已提交)。
4、Read uncommitted:最低级别,以上情况均无法保证。(读未提交)
总结:项目中,对于select操作不需要事务,对于其它操作(update/delete/insert)操作需要事务。