JDBC事务处理

一、数据库事务

1、概述

一组要么同时执行成功,要么同时失败的SQL语句。是数据库操作的一个不能分割执行单元。

​数据库事务(Database Transaction) ,是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。 事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源。通过将一组相关操作组合为一个要么全部成功要么全部失败的单元,可以简化错误恢复并使应用程序更加可靠。一个逻辑工作单元要成为事务,必须满足所谓的ACID(原子性、一致性、隔离性和持久性)属性。事务是数据库运行中的逻辑工作单位,由DBMS中的事务管理子系统负责事务的处理。

2、事务的开始

  • 连接到数据库上,并执行一条DML语句insert、update或delete
  • 前一个事务结束后,又输入了另一条DML语句

3、事务的结束

  • 执行commit或rollback语句
  • 执行一条DDL语句,例如create table语句,在这种情况下,会自动执行commit语句
  • 执行一条DDL语句,例如grant语句,在这种情况下,会自动执行commit
  • 断开与数据库的连接,比如断电等意外情况
  • 执行了一条DML语句,该语句却失败了,在这种情况中,会为这个无效的DML语句执行rollback语句

4、事务的四大特点ACID

  • Atomicity(原子性)

表示一个事务内的所有操作是一个整体,要么全部成功,要么全部失败

  • Consistency(一致性)

表示一个事务内有一个操作失败时,所有的更改过的数据都必须回滚到修改前状态

  • Isolation(隔离性)

事务查看数据时数据所处的状态,要么是另一并发事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看中间状态的数据。

  • Durability(持久性)

持久性事务完成之后,它对于系统的影响是永久性的。

二、数据库事务的回滚

1、Mysql支持的事务语句

可以参考《MySQL数据库——数据库概述及SQL相关基本操作》

#1 开始事务
START TRANSACTION;
#2 执行语句
UPDATE account SET money=money-1000 WHERE id=1;
UPDATE account SET money=money+1000 WHERE id=2;
#3 正常提交
COMMIT;
#4 如果失败回滚,如果提交了,就无法回滚了,否则的话回滚,数据回复到开始事务的状态
ROLLBACK;

2、JDBC中事务应用

2.1 回滚机制

JDBC连接默认处于自动提交 模式,则每个SQL语句在完成后都会提交到数据库。

事务使您能够控制是否和何时更改应用于数据库。它将单个SQL语句或一组SQL语句视为一个逻辑单元,如果任何语句失败,则整个事务将失败。

要启用手动事务支持,而不是JDBC驱动程序默认使用的自动提交 模式,请使用Connection对象的setAutoCommit() 方法。如果将boolean false传递给setAutoCommit(),则关闭自动提交。我们可以传递一个布尔值true来重新打开它。

//JDBC事务回滚

/*
* 正常转账情况下,就是甲方扣除1000元,乙方加和1000元,如果在甲方扣除1000元的时候,直接提交数据库
* 进行永久保存,还未在乙方进行加和,出现突发情况,则会导致,1000元流失,乙方数据库未变,所以需要
* 设定回滚机制,保证金额没有问题
*/
public class Demo2 {
   
    public static void main(String[] args) throws SQLException {
   
        Connection connection = DBUtil.getConnection();
        connection.setAutoCommit(false);    //自动提交关闭
        PreparedStatement statement = null;
        try {
   
            statement = connection.prepareStatement("update account set money = money + ? where id = ?");
            statement.setObject(1, -1000);
            statement.setObject(2, 1);
            statement.executeUpdate();  //每执行一条SQL语句,必须书写该条语句,刷新继续执行,否则上面语句被覆盖
            int i = 2/0;	//模拟断电突发情况
            statement.setObject(1, 1000
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值