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

来源:互联网 发布:看片同声翻译软件 编辑:程序博客网 时间:2024/06/05 16:19
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);}}


原创粉丝点击