标签:blog io os ar java 数据 2014 on log
package com.itheima.trans;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import com.itheima.util.DBUtil;
public class TransDemo {
/*
创建mysql数据库相关sql语句:
create database day11;
use day11;
create table account(
id int primary key auto_increment,
name varchar(20),
salary double
);
insert into account values(null, 'a', 1000);
insert into account values(null, 'b', 1000);
*/
public static void main(String[] args) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
conn = DBUtil.getConn();
conn.setAutoCommit(false);//设置自动事务提交为false
//a给b转账-----a账户减去100块钱;b账户增加100块钱
ps = conn.prepareStatement("update account set salary=salary-100 where name=?");
ps.setString(1, "a");
ps.executeUpdate();
int i = 1 / 0; //设置异常
ps = conn.prepareStatement("update account set salary=salary+100 where name=?");
ps.setString(1, "b");
ps.executeUpdate();
conn.commit();
} catch (Exception e) {
e.printStackTrace();
try {
conn.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
} finally {
DBUtil.close(conn, ps, rs);
}
}
}
代码解析:
默认情况下每执行一条sql语句,就是执行一次事务,也就是每一条sql语句的执行都会是一次事务的提交。
在这个例子中如果a给b转账,a账户减去100的sql语句执行成功,这时伴随着一次的事务提交,数据库中的a账户金额减去100;而再执行b的账务增加100sql语句之前,出现了异常,这里我设了一个除以零异常,此时程序终止,bsql语句不再执行。a账户扣了100,而b账户则金额不变。这时数据出错。
解决方法是:通过conn.setAutoCommit(false);方法设置事务自动提交为false。这时每一次的sql语句执行完成后就不会提交事务,数据库中的数据并不会发生改变,当俩个sql都执行完成,然后调用coon.commit();方法提交事务,此时数据库中的数据才会真正的改变。如果中途发生异常,通过conn.rollback();方法回滚,此时之前执行的sql语句的结果并不会提交。这样数据就不会出错了。
设置Savepoint:
package com.itheima.trans;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Savepoint;
import com.itheima.util.DBUtil;
public class TransDemo {
/*
创建mysql数据库相关sql语句:
create database day11;
use day11;
create table account(
id int primary key auto_increment,
name varchar(20),
salary double
);
insert into account values(null, 'a', 1000);
insert into account values(null, 'b', 1000);
*/
public static void main(String[] args) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
Savepoint point = null;
try {
conn = DBUtil.getConn();
conn.setAutoCommit(false);//设置自动事务提交为false
//a给b转账-----a账户减去100块钱;b账户增加100块钱
ps = conn.prepareStatement("update account set salary=salary-100 where name=?");
ps.setString(1, "a");
ps.executeUpdate();
ps = conn.prepareStatement("update account set salary=salary+100 where name=?");
ps.setString(1, "b");
ps.executeUpdate();
point = conn.setSavepoint();
int i = 1 / 0;
//a给b转账-----a账户减去100块钱;b账户增加100块钱
ps = conn.prepareStatement("update account set salary=salary-100 where name=?");
ps.setString(1, "a");
ps.executeUpdate();
ps = conn.prepareStatement("update account set salary=salary+100 where name=?");
ps.setString(1, "b");
ps.executeUpdate();
conn.commit();
} catch (Exception e) {
e.printStackTrace();
try {
if(point == null) {
conn.rollback();
} else {
conn.rollback(point);
conn.commit();
}
} catch (SQLException e1) {
e1.printStackTrace();
}
} finally {
DBUtil.close(conn, ps, rs);
}
}
}
标签:blog io os ar java 数据 2014 on log
原文地址:http://blog.csdn.net/m631521383/article/details/40403431