mysql事务操作
sql语句 | 描述 |
start transaction; | 开启事务(mysql 默认事务自提交,我们应该设置手动提交) |
commit; | 提交事务 |
rollback; | 回滚事务 |
- MYSQL中可以有两种方式进行事务的管理:
- 手动提交:先开启,再提交
-
start transaction;
update account set money=money-1000 where name='Jack';
update account set money=money+1000 where name='Rose';
commit;
#或者
rollback;
-
2.自动提交:MySql默认自动提交。及执行一条sql语句提交一次事务。
-
* 设置自动提交的参数为OFF:
set autocommit = 0; -- 0:OFF 1:ON
-
注意:Oracle数据库事务不自动提交
JDBC事务操作
Connection对象的方法名 | 描述 |
conn.setAutoCommit(false) | 开启事务 start transaction; |
conn.commit() | 提交事务 |
conn.rollback() | 回滚事务 |
//事务模板代码
public void demo01() throws SQLException{
// 获得连接
Connection conn = null;
try {
//#1 开始事务
conn.setAutoCommit(false);
//....
//#2 提交事务
conn.commit();
} catch (Exception e) {
//#3 回滚事务
conn.rollback();
} finally{
// 释放资源
conn.close();
}
}
DBUtils事务操作
Connection对象的方法名 | 描述 |
conn.setAutoCommit(false) | 开启事务 |
new QueryRunner() | 创建核心类,不设置数据源(手动管理连接) |
query(conn , sql , handler, params ) 或 update(conn, sql , params) | 手动传递连接 |
DbUtils.commitAndCloseQuietly(conn) 或 DbUtils.rollbackAndCloseQuietly(conn) | 提交并关闭连接 回滚并关闭连接 |
过程与JDBC操作一样,只不过需要注意的是,connection必须手动控制,不能交给DBUtils去控制。
说明 : Service 层代码中关于 `事务提交与回滚` 使用 DBUtils 方式实现, 代码如下 :
public class AccountService {
// 转账操作
public boolean tranfer(String outUser, String inUser, int money) {
// 开启事务 : (由 `连接` 对象来控制)
Connection conn = null;
AccountDao accountDao = new AccountDao();
try {
// 获取连接对象
conn = JDBCUtils.getConnection();
// 开启事务
conn.setAutoCommit(false);
accountDao.out(conn, outUser, money);
int i = 10 / 0;
accountDao.in(conn, inUser, money);
// 提交事务 (让修改永久保存)
DbUtils.commitAndCloseQuietly(conn);
// 返回
return true;
} catch (Exception e) {
e.printStackTrace();
// 回滚事务
DbUtils.rollbackAndCloseQuietly(conn);
}
return false;
}
}