用idea提交事务
用idea提交事务
要么都成功要么都失败
ACID原则:原子性 要么要么、一致性 总数不变、隔离性 多进程互不干扰、持久性 一旦提交不可逆
提交事务练习
/*测试事务
成功则提交,失败则回滚
*/
import com.xy.MySQL.myMethods.JDBCUtils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class TestTransaction1 {
public static void main(String[] args) {
Connection conn = null;
PreparedStatement pst = null;
ResultSet rs = null;
try{
//连接数据库
conn = JDBCUtils.getConnection();//连接到jdbctest数据库
//关闭数据库的自动提交功能,会自动开启事务
conn.setAutoCommit(false);//因为会自动开启事务,所以不用像SQL语句那样再写开启事务语句
//执行业务
String sql1 = "UPDATE account SET money = money-100 WHERE name='A'";
pst = conn.prepareStatement(sql1);
pst.executeUpdate();
String sql2 = "update account set money = money+100 where name='B'";
pst = conn.prepareStatement(sql2);
pst.executeUpdate();
//业务完毕,提交事务
conn.commit();
System.out.println("转账成功");
conn.setAutoCommit(true);//开启自动提交
} catch (SQLException e){
try{
System.out.println("转账失败");
conn.rollback();//如果失败则回滚业务
}catch(SQLException e1){
e1.printStackTrace();
}
e.printStackTrace();
} finally {
JDBCUtils.release(conn,pst,rs);
}
}
}
运行结果
如上图所示,事务提交成功
接下来再试验一下提交失败回滚
在两个sql之间加一条必定失败的语句,如 int i = 1/0;
/*测试事务
成功则提交,失败则回滚
*/
import com.xy.MySQL.myMethods.JDBCUtils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class TestTransaction2 {
public static void main(String[] args) {
Connection conn = null;
PreparedStatement st =null;
ResultSet rs = null;
try {
conn = JDBCUtils.getConnection();
conn.setAutoCommit(false);
//关闭自动提交 也就是开启事务
String sql1 = "update account set money=money-100 where name ='A'";
st=conn.prepareStatement(sql1);
st.executeUpdate(sql1);
int i=1/0; //万能报错
String sql2 = "update account set money=money+100 where name ='B'";
st=conn.prepareStatement(sql2);
st.executeUpdate(sql2);
//事务提交
conn.commit();
System.out.println("转账成功");
conn.setAutoCommit(true);
} catch (SQLException throwables) {
//如果失败自动回滚
try {
System.out.println("转账失败");
conn.rollback();
} catch (SQLException e) {
e.printStackTrace();
}
throwables.printStackTrace();
}finally {
JDBCUtils.release(conn,st,rs);
}
}
}
分析一下,很明显sql1会成功
因为中间插了个万能报错语句,很明显sql2是不会成功的
由事物的原子性分析,整个事务不会成功提交,捕捉异常,回滚
所以sql1和sql2都会失败,数据库表account数据回滚
运行结果
如上图所示,数据提交失败回滚,我们的分析是正确的
在使用idea提交事务的过程中,我遇到了一个很纠结的问题
idea总是报错:Lock wait timeout exceeded; try restarting transaction
即锁等待超时。让我头疼了好久
在机缘巧合下,我发现了报错的原因
代码一开始就是关闭自动提交conn.setAutoCommit(false);
可我在之前的学习过程中已经关闭了自动提交
于是我尝试着先打开自动提交再运行程序
竟然成功了
我仿佛知道为什么每次执行完事务以后都要重新开启自动提交了
我也不确定是不是这样的,反正我是成功了~~
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律