所谓事务是指:一组逻辑操作单元,使数据从一种状态变换到另一种状态。

事务的ACID属性

  原子性,Atomicity:事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
  一致性,Consistency:事务必须使数据库从一个一致性状态变换到另一个一致性状态。
  隔离性,Isolation:一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
  持久性,Durability:持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来的其他操作和数据库故障不应该对其有任何影响。

为了让多个SQL语句作为一个事务执行:

  • 调用Connection对象的setAutoCommit(false);以取消自动提交事务
  • 在所有SQL语句都执行后,调用commit();方法提交事务
  • 在出现异常时,调用rollback()方法回滚事务
  • 若此时Connection没有被关闭,则需要恢复其自动提交状态

关于事务:

  如果多个操作,每个操作使用的是自己的单独的连接,则无法保证事务。

  具体步骤:

    事务操作开始前,开始事务:取消Connection默认的提交行为;

    如果事务的操作都成功,则提交事务;

    回滚事务:若出现异常,则在catch块中回滚事务。

代码:

  • 新增DAO一个方法,这个方法把Connection提出来作为传参

    // 外部来处理Connection
void update(Connection conn, String sql, Object... args) {
PreparedStatement ps = null; try {
ps = conn.prepareStatement(sql); for (int i = 0; i < args.length; i++) {
ps.setObject(i + 1, args[i]);
}
ps.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCTools.release(null, ps, null);
}
}

测试事务

package com.litian.jdbc;

import java.sql.Connection;
import java.sql.SQLException; /**
* @author: Li Tian
* @contact: litian_cup@163.com
* @software: IntelliJ IDEA
* @file: TransactionTest.java
* @time: 2020/4/1 14:06
* @desc: |
*/ public class TransactionTest {
public static void main(String[] args) {
DAO dao = new DAO(); Connection conn = null; try {
conn = JDBCTools.getConnection(); // 开始事务:取消默认提交
conn.setAutoCommit(false);
String sql = "update t_user2 set money = money - 500 where id = 21023";
dao.update(conn, sql); // 插入错误
int i = 10 / 0;
System.out.println(i); sql = "update t_user2 set money = money + 500 where id = 21024";
dao.update(conn, sql); // 提交事务
conn.commit();
} catch (Exception e) {
e.printStackTrace(); try {
conn.rollback();
} catch (SQLException ex) {
ex.printStackTrace();
}
} finally {
JDBCTools.release(null, null, conn);
}
}
}

事务的隔离级别

脏读:读取了更新还未提交的数据,但进行了回滚,所以读取的内容是临时的且无效的。
不可重复读:某个事务多次读取一个字段,值却不同,这是因为中间别的事务更新的该字段。
幻读:某个事务从一个表中读取了信息,然后另一个事务更新了该表,使得之前事务再读的时候,表的行数改变了。
数据库提供了4种事务隔离级别

  • READ UNCOMMITED:读未提交数据,3种问题都会出现
  • READ COMMITED:读已提交数据,避免脏读
  • REPEATABLE READ:可重复度,避免脏读和不可重复读
  • SERIALIZABLE:串行化,避免3种问题

Oracle支持2种事务隔离级别:READ COMMITED(默认)和SERIALIZABLE

Mysql支持4种事务隔离级别:默认REPEATABLE READ

在JDBC程序中可以通过Connection的setTransactionIsolation来设置事务的隔离级别

————————————————
版权声明:本文为CSDN博主「李英俊小朋友」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_21579045/article/details/105386353

MYSQL 之 JDBC(十三):处理事务的更多相关文章

  1. mysql进阶(二十三)数据库事务四大特性

    数据库事务四大特性       原子性.一致性.分离性.持久性 原子性  事务的原子性指的是,事务中包含的程序作为数据库的逻辑工作单位,它所做的对数据修改操作要么全部执行,要么完全不执行.这种特性称为 ...

  2. java:Oracle(事务,分页,jdbc)Mysql(jdbc)

    1.事务:transaction -- 事务开启的唯一条件就是:对数据库进行增,删,改的时候 -- 换句话说,对数据进行增删改以后,必须要执行提交或者回滚 -- 事务就是把数据库中的数据从一致状态转换 ...

  3. Java数据库连接——JDBC调用存储过程,事务管理和高级应用

    一.JDBC常用的API深入详解及存储过程的调用 相关链接:Jdbc调用存储过程 1.存储过程(Stored Procedure)的介绍 我们常用的操作数据库语言SQL语句在执行的时候需要先编译,然后 ...

  4. JAVAEE——spring03:spring整合JDBC和aop事务

    一.spring整合JDBC 1.spring提供了很多模板整合Dao技术 2.spring中提供了一个可以操作数据库的对象.对象封装了jdbc技术. JDBCTemplate => JDBC模 ...

  5. JDBC&&c3p0、事务、批处理、多线程 于一体的经典秘方QueryRunner

    目录: 基础篇_功能各自回顾 JDBC基础代码回顾(使用JdbcUtils工具简化) c3p0数据库连接池的使用(使用JdbcUtils工具简化) 大数据的插入(使用c3p0+JdbcUtils工具简 ...

  6. 十三、事务、连接池 、ThreadLocal 、BaseServlet自定义Servlet父类 、 DBUtils à commons-dbutils

    l 事务 l 连接池 l ThreadLocal l BaseServlet自定义Servlet父类(只要求会用,不要求会写) l DBUtils à commons-dbutils 事务 l 事务的 ...

  7. java框架之Spring(3)-JDBC模板使用&事务管理

    下面内容使用到的 jar 包下载 JDBC模板使用 入门 1.导包,如要导入 Spring 的基本开发包.数据库驱动包.Spring 提供的 JDBC 模板包,如下: 2.测试: @Test publ ...

  8. JDBC编程之事务的使用教程

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

  9. MySQL 系列(三)事务

    MySQL 系列(三)事务 一组要么同时执行成功,要么同时执行失败的 SQL 语句.是数据库操作的一个执行单元! 事务开始于: 连接到数据库上,并执行条 DML 语句(INSERT. UPDATE 或 ...

  10. JAVA JDBC(存储过程和事务管理)

    1.什么是存储过程 存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,存储在数据库中,经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程 ...

随机推荐

  1. DedeCms 首页、列表页调用文章body内容的方法

    [第一种方法] arclist标签使用如下: {dede:arclist row='1' typeid='1' addfields='body' idlist='1' channelid='1'} [ ...

  2. mybatis 学习教程

    https://www.cnblogs.com/ashleyboy/category/1246107.html

  3. php 判断设备是手机还是平板还是pc

    1 <?php 2 //获取USER AGENT 3 $agent = strtolower($_SERVER['HTTP_USER_AGENT']); 4 5 //分析数据 6 $is_pc ...

  4. MFC基于CAsyncSocket套接字客户端代码示范

    MFC基于CAsyncSocket套接字客户端代码示范 https://blog.csdn.net/txwtech/article/details/93016190

  5. 【初学Java学习笔记】AOP与OOP

    AOP(Aspect Oriented Programming) 面向切面编程,是属于Spring框架中的内容.AOP相当于OOP的补充,当我们需要对多个对象引入一个公共行为,比如日志,操作记录等,就 ...

  6. 浅析Java中Ant的使用

     Ant是一种基于Java的打包工具,Ant脚本采用XML格式编写,默认的文件名为build.xml. Ant中常用的节点元素 Project Project是项目工程的顶级节点,一个build. ...

  7. VM363:1 Uncaught SyntaxError: Invalid or unexpected token

    此报错主要是因为json字符串转json对象时,json字符串中出现特殊字符(如:换行符)报错. json字符转json对象(如下写则报错) 更改后 参考地址: https://www.cnblogs ...

  8. ASP.NET MVC 四种Controller向View传值方法

    控制器: // Get: Data public ActionResult Index() { //ViewData 方式 ViewData["UserName"] = " ...

  9. 洛谷 P1186 【玛丽卡】

    这道题题目真的想吐槽一下...是在机房同学的解释下才看懂的.就是让你求在可以删一条边的情况下,并且删后保证可以到达终点时,求删了后的最大的最短路径. 70分暴力思路: 枚举删边,然后跑一下最短路即可, ...

  10. 聊聊Java中的异常及处理

    前言 在编程中异常报错是不可避免的.特别是在学习某个语言初期,看到异常报错就抓耳挠腮,常常开玩笑说编程1分钟,改bug1小时.今天就让我们来看看什么是异常和怎么合理的处理异常吧! 异常与error介绍 ...