在jdbc中通过Connection来控制事务的三个方法;
setAutoCommit(false):控制是否自动提交
commit():提交
rollback():回退
事务的一个事例
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
class BookOperation {
public static void main(String[] args) throws SQLException {
buy(1,1);
}
public static boolean buy(int userid,int bookid) throws SQLException {
//更新两个表,库存表:count-1; 用户表:余额-价格;
String update1="update bookstore set count=count-1 where bookid =?";
String update2="update bookuser set remain=remain-(select price from book where bookid=?) where userid =?";
String query1="select count from bookstore where bookid=?";
String query2="select remain from bookuser where userid=?";
Connection conn= JdbcUtil.getConnection();
try(PreparedStatement ps_u1=conn.prepareStatement(update1);
PreparedStatement ps_u2=conn.prepareStatement(update2);
PreparedStatement ps_q1=conn.prepareStatement(query1);
PreparedStatement ps_q2=conn.prepareStatement(query2);){
conn.setAutoCommit(false);
//两个操作完成
ps_u1.setInt(1, bookid);
ps_u1.execute();
ps_u2.setInt(1, bookid);
ps_u2.setInt(2, userid);
ps_u2.execute();
//查询
ps_q1.setInt(1, bookid);
ResultSet rs1=ps_q1.executeQuery();
rs1.next();
int count =rs1.getInt(1);
ps_q2.setInt(1, userid);
ResultSet rs2=ps_q2.executeQuery();
rs2.next();
int remain=rs2.getInt(1);
if(remain<0) {
throw new Exception("余额不足");
}
else if(count<0){
throw new Exception("库存不足");
}
else {
conn.commit();
System.out.println("购买成功:余额是: "+remain+",库存为:"+count);
}
}catch(Exception e) {
e.printStackTrace();
conn.rollback();
}finally {
conn.close();
}
return false;
}
}