我的编程空间,编程开发者的网络收藏夹
学习永远不晚

深入详解数据库事务(开发必用)

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

深入详解数据库事务(开发必用)

 一.事务的概念:

一组逻辑操作单元,时数据从一个状态转换到另一个状态。

 二.事务处理的原则:

        保证所有的事务都被当做一个操作单元来执行,即使出现了故障,也不能改变这种处置原则。要么与事务相关的数据全部被修改,并永远的提交保存下来,要么所有的事务全部回滚到事务没被执行的状态。

三.那些操作会影响数据库的提交

(一).数据库连接一旦断开,数据库的数据都被会提交

(二).DDL操作完成,数据自动提交,并且无法回滚

(三).DML操作默认为提交,但是可以通过 set auto commit = false;来设置不允许自动提交

四.模拟事务提交

事务执行过程图:

 

 

通用的包含事务的更新方法

        public static int update(Connection conn,String sql,Object... args){        int temp = -1;        PreparedStatement pst = null;        try{            //2.预编译sql语句            pst = conn.prepareStatement(sql);            //3.填充占位符            for (int i = 0; i < args.length; i++) {                pst.setObject(i+1,args[i]);            }            //4.执行            //            pst.execute();            temp = pst.executeUpdate();        }catch (Exception e){            e.printStackTrace();        }finally {            //5.释放资源            closeResource(null,pst);        }        return temp;    }

(一).模拟存在异常情况下的102给103转账100元操作;

public void testTransaction() throws Exception {        Connection conn = null;        //102向103转账100元        try{            conn = JDBCUtils.getConnection();            //关闭DML自动调教功能            conn.setAutoCommit(false);            String sql1 = "update user_tab set balance = balance - 100 where id = ?";            update(conn,sql1,102);            //模拟异常            System.out.println(10/0);            //103接受102转账100元            String sql2 = "update user_tab set balance = balance + 100 where id = ?";            update(conn,sql2,103);            //提交事务            conn.commit();            System.out.println("转账成功");        }catch (Exception e ){            e.printStackTrace();            //出现异常数据回滚            conn.rollback();        }finally {//将自动提交功能设置还原为true            conn.setAutoCommit(true);            JDBCUtils.closeResource(conn,null);        }    }

转账失败

 (二).模拟不存在异常下转账的情况

public void testTransaction() throws Exception {        Connection conn = null;        //102向103转账100元        try{            conn = JDBCUtils.getConnection();            //关闭DML自动调教功能            conn.setAutoCommit(false);            String sql1 = "update user_tab set balance = balance - 100 where id = ?";            update(conn,sql1,102);            //模拟异常//        System.out.println(10/0);            //103接受102转账100元            String sql2 = "update user_tab set balance = balance + 100 where id = ?";            update(conn,sql2,103);            //提交事务            conn.commit();            System.out.println("转账成功");        }catch (Exception e ){            e.printStackTrace();            //出现异常数据回滚            conn.rollback();        }finally {//将自动提交功能设置还原为true            conn.setAutoCommit(true);            JDBCUtils.closeResource(conn,null);        }    }

转账成功

四.事务的ACID属性

(一).事务的属性

1.原子性:

        原子性是指事务时一个不可分割的工作单元,事务中的操作要么都发生,要么都不发生

2.一致性:

        事务必须使数据库从一个一致状态转换到另一个一致状态

3.隔离性:

        事务并发在执行时,各个事务之间的数据互不干扰的,各个事务 之间的数据不受任何影响

4.持久性:

        事务一旦被提交,就是永久性的改变,接下来发生的事或数据库故障都不会对其有任何我影响。

(二).事务的并发问题

1.脏读:

        读出了未提交的数据。

        事务T1,事务T2,T1读入一个数据段A,读出值为1,此时T2修改了A的值,T1将A= 2的值读出,但此时T2撤销了事务,回滚到A=1的阶段。此时T1读出的数据无效,即为脏读:

2.不可重复读:

只读提交的数据,并且第一次读出来是什么,在提交之前,读出来的东西和第一次保持一致;

        事务T1在第一次读到A=1,在读到以后,无论其他事务(T2)对字段A怎么更新提交(A=2),T1在提交前读出A字段永远都是A=1;

3.幻读:

事务T1第一次读出100条数据,T2插入3条数据并提交,T1提交后,T1再次读,读出103条数去,即为幻读,

(三).隔离级别

1. READ UNCOMMITED(读未提交的数据)

2. READ COMMITED(读已提交的数据)

3. REPEATED READ(可重复读)

4. 串行化:SERIALIZABLE(各个事务顺序执行)

(四).java代码实现隔离级别(框架必用,提前打基础

package Transaction;import UpAndSelMethod.Method;import jdbcUtil.JDBCUtils;import org.junit.Test;import userBean.User;import java.sql.Connection;//*********卧槽,为啥我设置隔离级别为读未提交却读不出来修改了却为体骄傲的数据,麻了******************public class Test隔离级别 {    //**************************测试事务并发问题与隔离级别的关系*********************************    //测试查询    @Test    public void testTransactionSelect() throws Exception {        Connection conn = JDBCUtils.getConnection();        //设置sql语句        String sql = "select id,name,balance from user_tab where id = ?";        //查看当前连接的的隔离级别        System.out.println(conn.getTransactionIsolation());        //设置当前连接的隔离级别为读未提交        conn.setTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED);        System.out.println(conn.getTransactionIsolation());        User user = Method.selectinfo(User.class, sql, 103);        System.out.println(user);    }    //测试更新    @Test    public void testTransactionUpdate() throws Exception {        //获取连接        Connection conn = JDBCUtils.getConnection();        //设置自动提交为false        conn.setAutoCommit(false);        //sql        String sql = "update user_tab set balance = ? where id = ?";        //执行更新操作        Method.update(conn,sql,5000,103);        //线程睡眠15秒        Thread.sleep(15000);        //睡眠结束        System.out.println("修改完成");    }}

 

来源地址:https://blog.csdn.net/qq_52655865/article/details/123977638

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

深入详解数据库事务(开发必用)

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

JavaSpring的数据库开发详解

这篇文章主要介绍了Spring的数据库开发,主要围绕SpringJDBC和SpringJdbcTemplate两个技术来讲解,文中有详细的代码示例,需要的小伙伴可以参考一下
2023-05-17

深入剖析数据库事务:了解其特性和注意事项

事务是数据库管理系统中确保数据完整性和一致性的一项重要机制。本文将探讨事务的特性、类型、隔离级别以及在使用事务时需要注意的事项,以帮助读者深入理解事务在数据库中的作用和使用方式。
深入剖析数据库事务:了解其特性和注意事项
2024-02-25

Oracle数据库事务的开启与结束详解

目录前言commitTruncate – DDLselect xxx for updateselect…for update使用方法失败的DML 和 exitDCL总结 前言Oracle的事务开始于一个DML语句
2022-06-23

MySQL 事务概念与用法深入详解

本文实例讲述了MySQL 事务概念与用法。分享给大家供大家参考,具体如下: 事务的概念 MySQL事务是一个或者多个的数据库操作,要么全部执行成功,要么全部失败回滚。 事务是通过事务日志来实现的,事务日志包括:redo log和undo l
2022-05-25

Android开发中的数据库事务用法分析

本文实例讲述了Android开发中的数据库事务用法。分享给大家供大家参考,具体如下: 在android应用程序开发中,在使用到数据库的时候,事务处理是非常重要的。 首先Android数据库操作(特别是写操作)是非常慢的,将所有操作打包成一个
2022-06-06

详解全栈开发Vercel数据库存储服务

这篇文章主要为大家介绍了全栈开发Vercel数据库存储服务功能使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-05-18

深入详解java高并发热点数据更新

这篇文章主要为大家深入介绍了java高并发热点数据更新详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-05-18

深入解析数据库事务隔离级别:揭示数据一致性之谜

事务隔离级别是数据库系统中一个重要的概念,通过了解数据库事务隔离级别,可以更轻松地保证数据库数据的安全性与一致性。
深入解析数据库事务隔离级别:揭示数据一致性之谜
2024-02-25

详解在Spring Boot中使用数据库事务

我们在前面已经分别介绍了如何在spring Boot中使用JPA以及如何在Spring Boot中输出REST资源。那么关于数据库访问还有一个核心操作那就是事务的处理了,前面两篇博客小伙伴们已经见识到Spring Boot带给我们的巨大便利
2023-05-31

如何解决PHP开发中的数据库事务问题

在PHP开发中,数据库事务是一个常见而重要的主题。事务可以确保一组数据库操作要么全部成功执行,要么全部失败回滚,从而保证数据的一致性和完整性。本文将介绍如何使用PHP进行数据库事务处理,并提供了具体的代码示例。一、什么是数据库事务数据库事务
2023-10-21

数据库事务的实现方式:深入了解其底层机制

:数据库事务是一种确保数据库操作原子性和一致性的机制,它允许用户将多个相关操作作为一个整体来执行,并且要么所有操作都成功,要么所有操作都失败。
数据库事务的实现方式:深入了解其底层机制
2024-02-25

触发器与数据库锁机制的深入解析

触发器和数据库锁机制是数据库管理中的两个重要概念,它们在数据库的并发控制和数据完整性方面发挥着关键作用。以下是对这两个概念的深入解析:触发器触发器是一种特殊的存储过程,它会在数据库中的某个表发生特定事件(如插入、更新或删除)时被自动执行
触发器与数据库锁机制的深入解析
2024-09-26

MySQL总结(十二)数据库事务-详解

数据库事务1. 事务的应用场景说明什么是事务?在实际的开发过程中,一个业务操作如:转账,往往是要多次访问数据库才能完成的。转账是一个用户扣钱,另一个用户加钱。如果其中有一条 SQL 语句出现异常,这条 SQL 就可能执行失败。事务执行是一个整体,所有的 SQL
MySQL总结(十二)数据库事务-详解
2020-01-22

三大常用数据库事务详解之三:事务运行模式

三、事务的运行模式通常,事务以3种模式运行,他们分别是:1. 自动提交事务每一条单独的SQL语句都在其执行完成后进行自动提交事务,即执行 SQL 语句后就会马上自动隐式执行 COMMIT 操作。如果出现错误,则进行事务回滚至之前状态。SQL SERVER和MY
三大常用数据库事务详解之三:事务运行模式
2016-04-09

编程热搜

目录