Javaweb对于JDBC事务回滚的实战与原理剖析详解
一.JDBC事务
1.1 什么是事务?
事务是指是程序中一系列严密的逻辑操作,而且所有操作必须全部成功完成,否则在每个操作中所作的所有更改都会被撤消。可以通俗理解为:就是把多件事情当做一件事情来处理,好比大家同在一条船上,要活一起活,要完一起完 。
事务的四大特性(ACID):
- 原子性
- 一致性
- 隔离性
- 持久性
事务(ACID)的原则:保证数据的安全。
通俗的理解:
要么都成功,要么都失败!
1.2 事务
1.开启事务
2.事务提交 commit()
3.事务回滚 rollback()
4.关闭事务
1.2.1 例子
转账例子:
A和B俩人各有1000块钱,A向B转账,只有俩种结果:
-
A-100,B+100= A有900元,B有1100元。
-
转账失败,AB各有1000元。
-
不可能出现其他的情况。
二.Junit单元测试
2.1 事务小实战—Junit
1.先添加依赖,到项目里的pom.xml文件里添加如下依赖:
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
</dependency>
2.@Test注解只有在方法上有效,只要加了这个注解就可以直接的运行:
public class JDBC {
@Test
public void test(){
System.out.println("111");
}
}
运行成功时候如下图:

运行失败时:是红颜色的!如下图

2.2 新建数据库
新建如下数据库,id,name,money。
填入几个初始数据:
1 A 1000
2 B 1000

在idea里链接MySQL数据库,如下图。

开启事务命令:
start transaction;
修改表,执行转账:
update account set money = money -100 where name =‘A’;
update account set money = money +100 where name =‘B’;
提交:
commit;
回滚:
rollback;
2.3 Java语句模拟转账事务
1.到上面测试的@test里,将上节里面的固定JDBC代码拿出:
String url="jdbc:mysql://localhost:3306/jdbc_demo?useUnicode=true&characterEncoding=UTF8";
String username="root";
String password =;
Class.forName("com.mysql.jdbc.Driver");
Connection connection = DriverManager.getConnection(url, username, password);
2.通知数据库开启事务,这里的false代表开启,true代表关闭!
connection.setAutoCommit(false);
3.写sql语句:这里是A减100元!
String sql = "update money set money = money -100 where name ='A'";
connection.prepareStatement(sql).executeUpdate();
4.写sql语句:这里是B加100元!
String sql2="update money set money = money +100 where name ='B'";
connection.prepareStatement(sql2).executeUpdate();A
5.connection.commit(); commit 主要是将暂存区里的改动给提交到本地的版本库
connection.commit();
6.输出运行成功提示语句:
System.out.println("success");
7.启动项目,得到下图:


事务运行成功!
2.4 事务回滚
1.制造错误代码,让其无法执行B的加一百元:
int a=1/0;
2.使用try和catch:
如果出现异常就通知业务回滚:
catch (Exception e){
try {
//如果出现异常就通知数据库回滚事务
connection.rollback();
}catch (SQLException e1){
e1.printStackTrace();
}
e.printStackTrace();
}
最后记得关闭资源,避免浪费占用资源:
finally {
try{
connection.close();
}catch (SQLException e){
e.printStackTrace();
}
主要如果出现异常就通知数据库回滚事务:
connection.rollback();
如果执行成功:

错误,不执行事务,执行事务回滚。
重点:
记得开启事务,如果不开启事务会报错!
- 点赞
- 收藏
- 关注作者
评论(0)