1、如何实现事务

如果现在希望对 A 表和 B 表同时删除某一个 id 号的记录,使这两个sql操作组成一个事务。(成功则同时成功,否则都失败)

注意:如果 B 表 建立了引用 A 表的id外键,并指定为 on delete cascade, 此时在删除 A 表中的id号时,会自动把对应的 B 表中的id号记录删除。

实践:同时删除course和teacher表中id号为5的记录;

  1. package com.dgd.test;
  2.  
  3. import java.sql.Connection;
  4. import java.sql.DriverManager;
  5. import java.sql.PreparedStatement;
  6. import java.sql.SQLException;
  7.  
  8. public class Test01 {
  9. public static void main(String[] args) throws ClassNotFoundException, SQLException {
  10. //①注册驱动
  11. Class.forName("com.mysql.cj.jdbc.Driver");
  12.  
  13. //url
  14. String url="jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT";
  15. //②获取连接
  16. Connection conn = DriverManager.getConnection(url, "root", "123456");
  17. System.out.println(conn.getClass());
  18.  
  19. //③*****设置手动提交事务
  20. conn.setAutoCommit(false);
  21.  
  22. //编写sql语句 1
  23. String sql1="DELETE FROM course where id=?";
  24. //编写sql语句 2
  25. String sql2="DELETE FROM teacher where id=?";
  26.  
  27. //④创建 PreparedStatement 对象
  28. PreparedStatement s1 = conn.prepareStatement(sql1);
  29. PreparedStatement s2 = conn.prepareStatement(sql2);
  30. //设置 ? 值
  31. s1.setObject(1,"5");
  32. s2.setObject(1,"5");
  33.  
  34. boolean flag1=true;//
  35. boolean flag2=true;// sql执行的标志位
  36.  
  37. try {
  38. //⑥执行sql语句
  39. int len1=s1.executeUpdate();
  40. System.out.println(len1>0?"删除course表成功":"删除course表失败");
  41. if(len1<0)
  42. {
  43. flag1=false;
  44. }
  45.  
  46. if(flag1==true)
  47. {
  48. int len2=s2.executeUpdate();
  49. System.out.println(len2>0?"删除teacher表成功":"删除teacher表失败");
  50. if(len2<0) {
  51. flag2=false;
  52. }
  53. }
  54. if(flag1==true && flag2==true)
  55. conn.commit();
  56. else
  57. conn.rollback();
  58. } catch (SQLException e) {
  59. System.out.println("发生异常");
  60. conn.rollback();
  61. }
  62.  
  63. //⑦关闭资源
  64. s1.close();
  65. s2.close();
  66. conn.setAutoCommit(true); //⑧还原
  67. conn.close();
  68. }
  69. }

当故意估计修改错 sql 语句(删除id 4)时,判断是否会回滚;

  1. //编写sql语句 1
  2. String sql1="DELETE FROM course where id=?";
  3. //编写sql语句 2
  4. String sql2="DELETE FROM teacher id=?";
  5.  
  6. //④创建 PreparedStatement 对象
  7. PreparedStatement s1 = conn.prepareStatement(sql1);
  8. PreparedStatement s2 = conn.prepareStatement(sql2);
  9. //设置 ? 值
  10. s1.setObject(1,"4");
  11. s2.setObject(1,"4");

虽然显示course表删除成功,但是实际上回滚,并没有实际提交;

course表中仍然存在id: 4

JDBC:处理事务的更多相关文章

  1. Spring总结——AOP、JDBC和事务的总结

    1.上一次总结了 Spring 的核心三大组件(Core,Beans,Context),今天总结的 AOP.JDBC和事务都可以看成是核心三大组件的应用. 其中 Spring 的事务管理又以 AOP ...

  2. 【JDBC】事务的使用

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/5868750.html 关于事务的理论知识.ACID特性等等,网上太多了,在此不一一重复.本文主要着重  事务 ...

  3. MySql事务及JDBC对事务的使用

    一 .事务的几个重要特性 1. 原子性 事务内的每个内容不可分割,是一个统一的整体.或同时进行或同时消亡. 2.一致性 事务执行前和事务执行后,状态都是统一的.如A转B 100元,A和B数据总额度没有 ...

  4. JDBC 之 事务

    1.概念:事务指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部不成功. 2.数据库开启事务的命令dtl: Start transaction开启事务 Rollback回滚事务(撤销) ...

  5. JDBC之事务隔离级别以及ACID特性

    JDBC之事务隔离级别以及ACID特性 事务隔离级别: 1.更新遗失(Lost update) 两个事务都同时更新一行数据,但是第二个事务却中途失败退出,导致对数据的两个修改都失效了.这是因为系统没有 ...

  6. 事务之使用JDBC进行事务的操作2

    本篇将讲诉如何使用JDBC进行数据库有关事务的操作.在上一篇博客中已经介绍了事务的概念,和在MySQL命令行窗口进行开启事务,提交事务以及回滚事务的操作. 似乎事务和批处理都可以一次同时执行多条SQL ...

  7. JDBC控制事务

    概念 事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit).事务通常由高级数据库操纵语言或编程语言(如SQL,C++或Java)书写的用户程序的执行所引起,并 ...

  8. JDBC进行事务管理

    JDBC进行事务管理 事务的四个特征:原子性 : 是指事务中包含的操作都被看做是一个逻辑单元一致性: 开始前和结束后数据库都处于一致性状态隔离性: 对数据库修改的多个事务是彼此隔离的持久性 事务完成之 ...

  9. JDBC处理事务

    一.什么是事务? 在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务! 二.事务是必须满足4个条件(AC ...

  10. Java -- JDBC 事务处理, 事务的隔离级别 脏读 不可重复读 等...

    1. 事务指逻辑上的一组操作,组成这组操作的各个单元,要不全部成功,要不全部不成功. 数据库开启事务命令 •start transaction 开启事务 •Rollback  回滚事务 •Commit ...

随机推荐

  1. ElasticSearch7.3学习(二十三)----RestHighLevelClient Java api实现match_all、ids、match、term、multi_match、bool、filter、sort等不同的搜索方式

    1.数据准备 首先创建book索引 PUT /book/ { "settings": { "number_of_shards": 1, "number ...

  2. MinIO学习

    1.Minio及背景 Minio是一个开源的分布式文件存储系统,它基于 Golang 编写,虽然轻量,却拥有着不错的高性能,可以将图片.视频.音乐.pdf这些文件存储到多个主机,可以存储到多个Linu ...

  3. vmware 虚拟机系统双屏或更多屏

    确保 VMware Workstation 软件已打开,且目标虚拟机已关机 编辑 > 首选项 > 显示 > 自动适应,确保 自动适应窗口.自动适应客户机 已勾选,点击 确定 保存 右 ...

  4. mybatis xml 中 trim 多余的符号

    <if test="(mac != null and mac != '') or (roomNo != null and roomNo != '') or (bedNo != null ...

  5. Java 统计新客户

    上周做了一个订单数据统计的任务,统计的是订单的新客户数量,本文做一个解题过程的记录和整理. 新客户的定义 新客户指的是选取时间段有订单,时间段之前没有订单. 比如下面的订单数据: 时间段 2月1日之前 ...

  6. 好客租房32-事件绑定this指向(class实例方法)

    class实例方法 利用箭头函数的class实例方法 //导入react import React from 'react'   import ReactDOM from 'react-dom' // ...

  7. CentOS7 单节点和多节点 HPL测试

    前置工作:安装OpenBLAS; 安装Mpich (可参考首页博客) 官网下载压缩包到/opt目录 cd /opt && wget https://www.netlib.org/ben ...

  8. [持续更新] Python学习、使用过程中遇见的非代码层面知识(想不到更好的标题了 T_T)

    写在前面: 这篇博文记录的不是python代码.数据结构.算法相关的内容,而是在学习.使用过程中遇见的一些没有技术含量,但有时很令人抓耳挠腮的小东西.比如:python内置库怎么看.python搜索模 ...

  9. HBase数据库基础操作

    实验要求: 根据上面给出的学生表Student的信息,执行如下操作: 用Hbase Shell命令创建学生表Student: create 'student','name', 'score' put ...

  10. Clash 规则的写法

    这篇博文是针对 CFW 写的. 最近尝试从 v2 转向使用 Clash.基于一个简单的需求:用 Spotify 听专的时候用代理,用 AM 听专的时候直连,我参考了以下完成了我的规则: CFW 官网的 ...