您的位置:首页 > 编程语言 > Java开发

java 数据事务处理 (必须在同一个连接,跨连接此方法无效,得用JPA)

2012-09-27 17:34 651 查看
package day18;

import java.sql.ResultSet;

import com.mysql.jdbc.Connection;
import com.mysql.jdbc.PreparedStatement;

import day17.DBManager;

public class TestTrans {

/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
//获取存入的金额和存款
double inbalance=3000;//request.getParameter("inbalance");
String accountid="12345678";
DBManager dbManager=null;
Connection conn=null;
PreparedStatement pstmt=null;
ResultSet rs=null;
//注册驱动
dbManager=new DBManager();
//获取连接
conn=dbManager.getConnection();
conn.getAutoCommit();//true 事务自动提交;false事务手动提交
System.out.println("conn.getAutoCommit()"+conn.getAutoCommit() );
//更改事务的提交方式***********
conn.setAutoCommit(false);

//存款,插入存款信息表
//组织sql语句
String sqlInsert="insert into inaccount(accountid,inbalance) values (?,?)";
pstmt=(PreparedStatement) conn.prepareStatement(sqlInsert);
pstmt.setString(1, accountid);
pstmt.setDouble(2, inbalance);
pstmt.executeUpdate();
//以账户为标准在账户基本信息表中查询余额
String sqlSelect="SELECT balance FROM account where accountid=?";
pstmt=(PreparedStatement) conn.prepareStatement(sqlSelect);
pstmt.setString(1, accountid);
rs=pstmt.executeQuery();//rs永远不为空
double balance=0;
if(rs.next()){
balance=rs.getDouble(1);
}
//计算新的余额
balance=balance+inbalance;

//模拟网络异常
int k=5/0;

//更新账户基本信息表
String sqlUpdate ="update account set balance=? where accountid=?";
pstmt=(PreparedStatement) conn.prepareStatement(sqlUpdate);
pstmt.setDouble(1, balance);
pstmt.setString(2, accountid);
pstmt.executeUpdate();
//使所有所有上一次的提交、回滚后进行的更改成为持久更改***********
conn.commit();
if(conn!=null){
conn.rollback();//取消当前事务的所有更改,并释放
//此Connection对象当前持有的数据库锁。该方法只应该在已禁用自动提交模式使用
}
dbManager.closeResource(conn,pstmt,null);

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐