您的位置:首页 > 数据库 > MySQL

Mysql事物回滚

2013-09-28 11:28 204 查看
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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: