MYSQL 之 JDBC(十三):处理事务
所谓事务是指:一组逻辑操作单元,使数据从一种状态变换到另一种状态。
事务的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(十三):处理事务的更多相关文章
- mysql进阶(二十三)数据库事务四大特性
数据库事务四大特性 原子性.一致性.分离性.持久性 原子性 事务的原子性指的是,事务中包含的程序作为数据库的逻辑工作单位,它所做的对数据修改操作要么全部执行,要么完全不执行.这种特性称为 ...
- java:Oracle(事务,分页,jdbc)Mysql(jdbc)
1.事务:transaction -- 事务开启的唯一条件就是:对数据库进行增,删,改的时候 -- 换句话说,对数据进行增删改以后,必须要执行提交或者回滚 -- 事务就是把数据库中的数据从一致状态转换 ...
- Java数据库连接——JDBC调用存储过程,事务管理和高级应用
一.JDBC常用的API深入详解及存储过程的调用 相关链接:Jdbc调用存储过程 1.存储过程(Stored Procedure)的介绍 我们常用的操作数据库语言SQL语句在执行的时候需要先编译,然后 ...
- JAVAEE——spring03:spring整合JDBC和aop事务
一.spring整合JDBC 1.spring提供了很多模板整合Dao技术 2.spring中提供了一个可以操作数据库的对象.对象封装了jdbc技术. JDBCTemplate => JDBC模 ...
- JDBC&&c3p0、事务、批处理、多线程 于一体的经典秘方QueryRunner
目录: 基础篇_功能各自回顾 JDBC基础代码回顾(使用JdbcUtils工具简化) c3p0数据库连接池的使用(使用JdbcUtils工具简化) 大数据的插入(使用c3p0+JdbcUtils工具简 ...
- 十三、事务、连接池 、ThreadLocal 、BaseServlet自定义Servlet父类 、 DBUtils à commons-dbutils
l 事务 l 连接池 l ThreadLocal l BaseServlet自定义Servlet父类(只要求会用,不要求会写) l DBUtils à commons-dbutils 事务 l 事务的 ...
- java框架之Spring(3)-JDBC模板使用&事务管理
下面内容使用到的 jar 包下载 JDBC模板使用 入门 1.导包,如要导入 Spring 的基本开发包.数据库驱动包.Spring 提供的 JDBC 模板包,如下: 2.测试: @Test publ ...
- JDBC编程之事务的使用教程
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/5868750.html 关于事务的理论知识.ACID特性等等,网上太多了,在此不一一重复.本文主要着重 事务 ...
- MySQL 系列(三)事务
MySQL 系列(三)事务 一组要么同时执行成功,要么同时执行失败的 SQL 语句.是数据库操作的一个执行单元! 事务开始于: 连接到数据库上,并执行条 DML 语句(INSERT. UPDATE 或 ...
- JAVA JDBC(存储过程和事务管理)
1.什么是存储过程 存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,存储在数据库中,经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程 ...
随机推荐
- Java StringTokenizer 类使用方法,字符串分割
Java StringTokenizer 属于 java.util 包,用于分隔字符串. StringTokenizer 构造方法: StringTokenizer(String str) :构造一个 ...
- 【实战】基于OpenCV的水表字符识别(OCR)
目录 1. USB摄像头取图 2. 图像预处理:获取屏幕ROI 2.1. 分离提取屏幕区域 2.2. 计算屏幕区域的旋转角度 2.3. 裁剪屏幕区域 2.4. 旋转图像至正向视角 2.5. 提取文字图 ...
- spark源码分析以及优化
第一章.spark源码分析之RDD四种依赖关系 一.RDD四种依赖关系 RDD四种依赖关系,分别是 ShuffleDependency.PrunDependency.RangeDependency和O ...
- range用法(倒序取值)
range(4,-1,-1) #倒数取值 ''' start: 计数从 start 开始.默认是从 0 开始.例如range(5)等价于range(0, 5); stop: 计数到 stop 结束,但 ...
- Dubbo——服务发布原理
引言 在使用Dubbo的时候你一定会好奇它是怎么实现RPC的,而要了解它的调用过程,必然需要先了解其服务发布/订阅的过程,本篇将详细讨论Dubbo的发布过程. 源码分析 发布服务 新学Dubbo大都会 ...
- cc30a_demo-CppPrimer_友元与继承-txwtech友元关系不能继承-要明确授予友元
//友元可以访问类的private与protected成员//友元关系不能继承-要明确授予友元 #include <iostream>//CppPrimer_友元与继承-txwtech-- ...
- 4.kubernetes的服务发现插件-CoreDNS
1.1.部署K8S内网资源清单http服务 1.2.部署coredns 部署K8S内网资源清单http服务 在运维主机HDSS7-200.host.com上,配置一个nginx虚拟主机,用以提高k8s ...
- 使用JUnit 和Jacoco进行单元测试
Jacoco配置 <dependency> <groupId>org.jacoco</groupId> <artifactId>jacoco-maven ...
- 使用IDEA 发布项目搭配远程仓库 Gitee
本次讲解的是idea 发布到gitee上 一样的操作流程 没有基础的请先去学习 附上我的 gitee 地址 有资源会发布到gitee 俗话说关注走一走 活到999 https://gitee.com/ ...
- cv2 exposureFusion (曝光融合)
import cv2 import numpy as np import sys filenames = ['./images/memorial0061.jpg', './images/memoria ...