一、存储过程
1、用当地数据库语言,写的一段业务逻辑算法,并该算法存储在客户端。
2、使用存储过程需要用于CallableStatement接口,调用代码:
CallableStatementcStmt=conn.prepareCall("{calldemoSp(?, ?)}");
3、对于存储过程的输出参数,需要注册:cstmt.registerOutParameter(3,Types.INTEGER);
4、取得返回值时,需要按照输出参数的位置来取。
5、案例如下:
1)MySql存储过程代码:
drop procedure add_pro;
delimiter//create procedure add_pro(aint,b int,out sum int)
begin
set sum= a +b;
end;//delimiter ;
2)调用存储过程代码:
packagecom.gnnuit.web.demo;importjava.sql.CallableStatement;importjava.sql.Connection;importjava.sql.ResultSet;importjava.sql.Types;importcom.gnnuit.web.util.JdbcUtill;public classDemo1 {public static voidmain(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)操作需要事务。