Java Web总结十四之一存储过程、事务

一、存储过程

  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)操作需要事务。

原文地址:https://www.cnblogs.com/FlySheep/p/3672750.html