Javaweb对于JDBC事务回滚的实战与原理剖析详解

上进小菜猪 发表于 2022/10/30 23:53:19 2022/10/30
【摘要】 一.JDBC事务 1.1 什么是事务?事务是指是程序中一系列严密的逻辑操作,而且所有操作必须全部成功完成,否则在每个操作中所作的所有更改都会被撤消。可以通俗理解为:就是把多件事情当做一件事情来处理,好比大家同在一条船上,要活一起活,要完一起完 。事务的四大特性(ACID):原子性一致性隔离性持久性事务(ACID)的原则:保证数据的安全。通俗的理解:要么都成功,要么都失败! 1.2 事务1....

一.JDBC事务

1.1 什么是事务?

事务是指是程序中一系列严密的逻辑操作,而且所有操作必须全部成功完成,否则在每个操作中所作的所有更改都会被撤消。可以通俗理解为:就是把多件事情当做一件事情来处理,好比大家同在一条船上,要活一起活,要完一起完 。

事务的四大特性(ACID):

  • 原子性
  • 一致性
  • 隔离性
  • 持久性

事务(ACID)的原则:保证数据的安全。

通俗的理解:

要么都成功,要么都失败!

1.2 事务

1.开启事务

2.事务提交 commit()

3.事务回滚 rollback()

4.关闭事务

1.2.1 例子

转账例子:

A和B俩人各有1000块钱,A向B转账,只有俩种结果:

  1. A-100,B+100= A有900元,B有1100元。

  2. 转账失败,AB各有1000元。

  3. 不可能出现其他的情况。

二.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");
    }
}

运行成功时候如下图:

image-20220906204448630

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

image-20220906204620157

2.2 新建数据库

新建如下数据库,id,name,money。

填入几个初始数据:

1 A 1000
2 B 1000

image-20220906205020957

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

image-20220906205202048

开启事务命令:

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.启动项目,得到下图:

image-20220906210706977

image-20220906210715482

事务运行成功!

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();

如果执行成功:

image-20220906231453640

错误,不执行事务,执行事务回滚。

重点:

记得开启事务,如果不开启事务会报错!

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区),文章链接,文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:cloudbbs@huaweicloud.com进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。