之前我们是使用MySQL的命令来操作事务。接下来我们使用JDBC来操作事务. 先来学习下相关的API
Connection中与事务有关的方法 | 说明 |
---|---|
setAutoCommit(boolean autoCommit) | 参数是true或false 如果设置为false,表示关闭自动提交,相当于开启事务; 类似sql里面的 start transaction; |
void commit() | 提交事务; 类似sql里面的 commit; |
void rollback() | 回滚事务; 类似sql里面的 rollback; |
try{ connection.setAutoCommit(false); //开启事务 ...操作数据库 connection.commit(); //提交事务 }catch(Exection e){ connection.rollback(); //回滚事务 }finally{ ...释放资源 }
create table account( id int primary key auto_increment, name varchar(20), money double ); insert into account values (null,'zs',1000); insert into account values (null,'ls',1000); insert into account values (null,'ww',1000);
zs给ls转100, 使用事务进行控制
1、获取得到连接;
2、开始事务;JDBC中是设置autocommit来进行操作的;
3、执行转换操作;
4、转账操作执行成功进行提交事务;转账操作失败则回滚事务;
package com.guang.jdbc; import com.guang.utils.JdbcUtils; import java.sql.Connection; import java.sql.PreparedStatement; /** * @Description: * @Author: lg */ public class TransferClient { public static void main(String[] args) throws Exception { Connection connection = null; PreparedStatement preparedStatement01 = null; PreparedStatement preparedStatement02 = null; try { //1.获得连接 connection = JdbcUtils.getConnection(); //*******开启事务********* connection.setAutoCommit(false); //2.创建预编译sql语句对象(2个) String sql01 = "update account set money = money-? where name = ?"; preparedStatement01 = connection.prepareStatement(sql01); String sql02 = "update account set money = money+? where name = ?"; preparedStatement02 = connection.prepareStatement(sql02); //3.设置参数, 执行(zs-100,ls+100) preparedStatement01.setDouble(1,100); preparedStatement01.setString(2,"zs"); preparedStatement01.executeUpdate(); int i = 1/0; //模拟出问题 preparedStatement02.setDouble(1,100); preparedStatement02.setString(2,"ls"); preparedStatement02.executeUpdate(); //*******提交事务********* connection.commit(); } catch (Exception e) { e.printStackTrace(); //*******回滚事务********* connection.rollback(); } finally { //4.释放资源 preparedStatement02.close(); JdbcUtils.closeAll(null,preparedStatement01,connection); } } }
connection.setAutoCommit(fasle); //开启事务 connection.commit(); //提交事务 connection.rollback(); //回滚事务