JDBC对事务的支持

发表时间:2017-05-11 16:53:46 浏览量( 17 ) 留言数( 0 )

学习目标:

1、了解Java的历史

2、为什么要学习Java语言

3、端正学习态度


学习过程:

一、jdbc中使用事务

我们先回顾一下什么是事务,事务(TRANSACTION)是作为单个逻辑工作单元执行的一系列操作,这些操作作为一个整体一起向系统提交,要么都执行、要么都不执行。事务是一个不可分割的工作逻辑单元 

那么在jdbc中如何可以实现是事务呢?我们平时使用jdbc时,并不需要显示的提交数据,因为jdbc会自动的在executeUpdate时执行提交,所以我们要在jdbc中使用事务,那么需要修改这个默认自动提交功能。

setAutoCommit(false);

常用的方法就是提交数据和回滚了

commit();

con.rollback();

二、举例说明

我们举一个简单的例子,添加多个用户,这里要求所有的用户都必须一次性添加,要么都成功添加,要么都添加失败,所以我们需要使用事务进行控制。

实现代码如下:

public void addUsers(List<User> users) {
    String sql = "insert into tb_user(user_name,user_pass) values(?,?)";
    try {
        getCon();
        //自动提交功能关闭
        connection.setAutoCommit(false);
        for (User user : users) {
            preExe(sql,new Object[] { user.getUserName(), user.getUserPass() });
            preparedStatement.executeUpdate();
        }
        //手动提交
        connection.commit();
    } catch (Exception e) {
        try {
            connection.rollback();//回滚
         } catch (SQLException e1) {
            // TODO Auto-generated catch block
             e1.printStackTrace();
        }
        e.printStackTrace();
    } finally {
        closeAll();
    }
}

然后你可以测试一下,为了更方便测试,我们把用户名的长度改为varchar(10),这样长度超过10的就会插入失败

public static void main(String[] args) {
		UserDao userDao = new UserDao();
		List<User> users=new ArrayList<User>();
		
		User user1=new User();
		user1.setUserName("bao01");
		user1.setUserPass("123");
		users.add(user1);
		
		//插入失败的语句
		User usertt=new User();
		usertt.setUserName("bao000000000000000000000000000000000000000000a");
		usertt.setUserPass("asdasdfas");
		users.add(usertt);
		
		
		User user2=new User();
		user2.setUserName("bao02");
		user2.setUserPass("2222");
		users.add(user2);
		
		userDao.addUsers(users);
		
		
	}

三、保存点(SavePoint)

JDBC也可以定义SavePoint接口,提供在一个更细粒度的事务控制机制。当设置了一个保存点后,可以rollback到该保存点处的状态,而不是rollback整个事务。Connection接口的setSavepoint和releaseSavepoint方法可以设置和释放保存点。大家可以自己上机尝试。

最后JDBC规范虽然定义了事务的以上支持行为,但是各个JDBC驱动,数据库厂商对事务的支持程度可能各不相同。如果在程序中任意设置,可能得不到想要的效果。