学习目标:
1、巩固事务的知识
2、JDBC对事务的支持和语法使用
学习过程:
一、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驱动,数据库厂商对事务的支持程度可能各不相同。如果在程序中任意设置,可能得不到想要的效果。