1 事务概述
2 转账案例的实现
2.1 mysql操作事务(了解)
sqlyog会让事务失效,所以试验的时候得用控制台。
sql语句 |
描述 |
start transaction; |
开启事务 |
commit; |
提交事务 |
rollback; |
回滚事务 |
mysql事务是默认自动提交。
扩展:Oracle数据库事务不自动提交。
2.2 jdbc操作事务
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import cn.itcast.c3p0utils.C3P0Utils;
/*
使用jdbc完成转账案例。
我们要把加钱和减钱看成是同一组操作,这组操作要么都成功,要么都失败。
可以使用事务去解决这个问题。
步骤:
转账之前开启事务。
如果整个过程没有出现问题,那么就提交事务。
如果整个过程出现了问题,那么就回滚。
如果使用jdbc操作事务,需要使用连接(Connection)对象去操作事务。
void setAutoCommit(boolean autoCommit):如果传递false,就是设置事务手动提交。也就是开启了事务。
void commit():提交事务
void rollback(): 回滚事物。
*/
public class Demo01JDBCTransaction {
public static void main(String[] args) {
Connection con = null;
try {
// 使用工具类获取一个连接
con = C3P0Utils.getConnection();
//通过连接获取到sql语句执行者对象
Statement st = con.createStatement();
//在sql语句执行前开启事务,保证后面的所有的sql语句都是同一组操作。
con.setAutoCommit(false);//false表示手动提交事务,也就是开启了事务
//执行sql语句
//先给jack的钱减去100
int row1 = st.executeUpdate("UPDATE account SET money=money-100 WHERE name='jack'");
System.out.println("row1:" + row1);
//模拟停电
System.out.println(10 / 0);
//给rose的钱加上100
int row2 = st.executeUpdate("UPDATE account SET money=money+100 WHERE name='rose'");
System.out.println("row2: " + row2);
//如果没有问题,就提交事务
con.commit();
System.out.println("转账成功");
} catch (Exception e) {
//如果转账过程出现问题,catch会捕获到这个异常,那么我们就在catch回滚事物
try {
if(con != null) {//非空判断,让程序更加的健壮(鲁棒)
con.rollback();
System.out.println("转账失败");
}
} catch (SQLException e1) {
e1.printStackTrace();
}
}
}
}
2.3 dbutils操作事务
import java.sql.Connection;
import java.sql.SQLException;
import org.apache.commons.dbutils.QueryRunner;
import cn.itcast.c3p0utils.C3P0Utils;
/*
使用DBUtils完成转账案例。
需要把加钱和减钱看成一组操作,要么都成功要么都失败。
还得用事务。
DBUtils操作事务也是通过连接(Connection)对象去操作。
DBUtils里面的QueryRunner在创建对象的时候一定要使用空参构造去创建对象。(因为另一种拿不到连接,没有连接就操作不了事务)
开启事物,提交事务,回滚事物和jdbc的操作是一样的。
步骤:
1. 创建QueryRunner对象(使用空参构造创建对象)
2. 获取到一个连接。
3. 使用这个连接开启事务。
4. 执行转账的sql语句。
5. 如果整个过程没有遇到问题,那么就提交。
如果整个过程遇到了问题,那么就回滚。
*/
public class Demo01DBUtilsTransaction {
public static void main(String[] args) {
Connection con = null;
try {
//创建QueryRunner对象(使用空参构造创建对象)
QueryRunner qr = new QueryRunner();
//获取到一个连接。
con = C3P0Utils.getConnection();
//使用这个连接开启事务。
con.setAutoCommit(false);
//执行转账的sql语句。
String sqlA = "UPDATE account SET money=money-100 WH