事务

1.事务
* 使用事务:保证一组操作(一个conn中的多条sql语句),要么全部执行成功,要么全部执行失败
* 数据库是有事务概念,执行sql语句,就会开启事务,执行成功会提交事务,执行失败会回滚事务
* mysql数据库:事务是自动的,自动的开启,自动的提交,自动的回滚;不管是提交还是回滚数据永久保存到数据库
* oracle数据库:事务手动的,手动的开启,手动的提交,手动的回滚;不管是提交还是回滚数据永久保存到数据库
* 使用Connection接口中的方法就可以把事务设置为手动的
* void setAutoCommit(boolean autoCommit) 将此连接的自动提交模式设置为给定状态。 (开启事务)
* autoCommit - 为 true 表示启用自动提交模式;事务是自动,我们控制不了
* 为 false 表示禁用自动提交模式;事务是手动,我们就可以控制什么时候开启,提交,回滚
* void commit() 一组sql全部执行成功,提交事务
* void rollback() 一组sql,有一条执行失败,就回滚事务;会把数据回滚到事务开启之前
2.转账案例
* 使用QueryRunner完成转账案例
* tom账户减去1000元
* update account set money=money-1000 where name='tom';
* jerry账户增加1000元
* update account set money=money+1000 where name='jerry';

* 注意:
* QueryRunner的构造方法:
* QueryRunner(); 空参
* update(conn),query(conn)
* 可以使用连接池的工具类获取conn,开启事务
* QueryRunner(DateSource ds); 带连接池
* update(),query()
* 带连接池的构造方法,QueryRunner会自动的从连接池中获取数据库连接conn
* 使用完毕自动把conn归还给连接池,和我们没有关系,我们看不到conn,也就控制不了事务
所以,一般我们都是用QueryRunner的空参构造方法

package cn.itcast.demo02.transferAccount;

import java.sql.Connection;
import java.sql.SQLException;

import org.apache.commons.dbutils.DbUtils;
import org.apache.commons.dbutils.QueryRunner;

import cn.itcast.demo01.Utils.C3P0UtilsXML;
public class Demo02QueryRunner {
public static void main(String[] args) {
//1.创建QueryRunner对象
QueryRunner qr = new QueryRunner();
//2.使用连接池的工具类获取conn
Connection conn = null;
try {
conn = C3P0UtilsXML.getConnection();

//开启事务
conn.setAutoCommit(false);

//3.使用QueryRunner中的方法update执行增删改的sql语句
int row1 = qr.update(conn,"update account set money=money-1000 where name='tom'");
System.out.println(0/0);
int row2 = qr.update(conn,"update account set money=money+1000 where name='jerry'");
//4.处理结果
if(row1>0 && row2>0){
System.out.println("转账成功!");

//提交事务
conn.commit();
}
} catch (Exception e) {
System.out.println(e);
System.out.println("转账失败!");

//回滚事务
try {
conn.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
}finally {
//C3P0UtilsXML.close(null, null, conn);
DbUtils.closeQuietly(conn);//归还给连接池
}
}
}

 

posted @ 2018-01-28 11:34  Zennon  阅读(143)  评论(0编辑  收藏  举报