1、事物是由一系列操作组成的一个逻辑工作单元
2、事物提交类型:
自动提交:执行一个保存一个数据
手动提交:先放入缓存,只有执行commit才能够保存到数据库中。在事物执行结束之后再提交,如果在事物执行期间发生错误,则回滚(rollback)到事物的开始
设置事物回滚步骤:(在dao中写事物回滚)
①设置事物提交类型为手动提交:auto=false;
②在执行所有sql语句之后再将数据保存到数据库中
③如果出了异常就将事物进行回滚
connection
conn.setAutoCommit(false) //提交方式,在第一个获得连接之后
conn.commit(); //提交,在所有操作执行之后
conn.rollback(); //事物回滚,数据回到原始状态。功能:清空缓存。在捕获异常的地方
案例如:银行中有存款,将存款和余额分开,则存一次款,余额就会改变,从而需要用到事物回滚
@Test
public void testSaveMoney() {
Connection conn = null;
PreparedStatement pstmt = null;
// 准备数据
String accountId = "123456789";
double money = 100;
try {
conn = JDBCUtils.getConnection();
/*****************************************************/
//设置事务为手动提交
System.out.println("默认事务为"+conn.getAutoCommit());//true代表自动提交,false手动提交
conn.setAutoCommit(false);
System.out.println("事务为"+conn.getAutoCommit());
/*****************************************************/
// 向inaccount表中插入一条记录
// sql: INSERT INTO inaccount(accountid,inbalance)
// VALUES('123456789',100)
String sql = "INSERT INTO inaccount(accountid,inbalance) VALUES(?,?)";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, accountId);
pstmt.setDouble(2, money);
pstmt.executeUpdate();//数据马上同步到数据库
// 更新account表,将指定账号的余额加上100
// UPDATE account SET balance=balance+100 WHERE
// accountid='123456789'
sql = "UPDATE account SET balance=balance+? WHERE accountid=?";
pstmt = conn.prepareStatement(sql);
pstmt.setDouble(1, money);
pstmt.setString(2, accountId);
//模拟因网络或不明原因出异常
boolean flag = true;
if(flag) {
throw new SQLException("因网络或不明原因出异常!");
}
pstmt.executeUpdate();
/*****************************************************/
//提交事务
conn.commit();
/*****************************************************/
} catch (SQLException e) {
/*****************************************************/
//回滚事务
try {
if(conn!=null) {
conn.rollback();
}
} catch (SQLException e1) {
e1.printStackTrace();
}
/*****************************************************/
e.printStackTrace();
} finally {
JDBCUtils.closeResource(conn, pstmt, null);
}
}