隔离区别对待?如何捆绑?Java中的jdbc数据库事务及其隔离级别

文章目录

    • 一、数据库事务简介
    • 二、JDBC事务处理
    • 三、事务的ACID属性
    • 四、数据库的隔离级别
    • 五、设置隔离级别


一、数据库事务简介

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

事务处理(事务操作):保证所有事务都作为一个工作单元来执行,即使出现了故障,都不能改变这种执行方式。当在一个事务中执行多个操作时,要么所有的事务都被提交(commit),那么这些修改就永久地保存下来;要么数据库管理系统将放弃所作的所有修改,整个事务回滚(rollback)到最初状态

为确保数据库中数据的一致性,数据的操作应当是离散的逻辑单元:当它全部完成时,数据的一致性可以保持,而当这个单元中的一部分操作失败,整个事务应全部视为错误,所有从起始点以后的操作应全部回退到开始状态。


二、JDBC事务处理

数据一旦提交,就不可回滚。

数据什么时候意味着提交?
①当一个连接对象被创建时,默认情况下是自动提交事务:每次执行一个 SQL 语句时,如果执行成功,就会向数据库自动提交,而不能回滚。
②关闭数据库连接,数据就会自动的提交。如果多个操作,每个操作使用的是自己单独的连接,则无法保证事务。即同一个事务的多个操作必须在同一个连接下。

JDBC程序中为了让多个 SQL 语句作为一个事务执行:
①调用 Connection 对象的 setAutoCommit(false) 以取消自动提交事务
②在所有的 SQL 语句都成功执行后,调用 commit() 方法提交事务
③在出现异常时,调用 rollback() 方法回滚事务

若 Connection 没有被关闭,还可能被重复使用,则需要恢复其自动提交状态setAutoCommit(true)。尤其是在使用数据库连接池技术时,执行close()方法前,建议恢复自动提交状态。

案例:用户AA向用户BB转账100

测试类:

package jdbc;import utils.jdbcUtils;import java.sql.Connection;
import java.sql.SQLException;/*** @Author: Yeman* @Date: 2022-01-30-16:04* @Description:*/
public class UpdateDate2 {public static void main(String[] args) {Connection conn = null;try {//获取连接conn = jdbcUtils.getSqlConnection();//取消自动提交,开启事务conn.setAutoCommit(false);//预编译sql语句String sql1 = "update user_table set balance = balance - 100 where user = ?";jdbcUtils.updateDate(conn,sql1,"AA");//模拟网络异常System.out.println(10 / 0);String sql2 = "update user_table set balance = balance + 100 where user = ?";jdbcUtils.updateDate(conn,sql2,"BB");//若没有异常则提交conn.commit();} catch (Exception e) {e.printStackTrace();//若有异常则回滚try {conn.rollback();} catch (SQLException throwables) {throwables.printStackTrace();}}finally {//恢复自动提交try {conn.setAutoCommit(true);} catch (SQLException e) {e.printStackTrace();}//关闭conn连接jdbcUtils.closeResource(conn,null);}}
}

工具类:

package utils;import java.io.InputStream;
import java.sql.*;
import java.util.Properties;/*** @Author: Yeman* @Date: 2022-01-12-14:34* @Description:操作数据库的工具类*/
public class jdbcUtils {/*** @Description 获取数据库连接* @Param []* @return java.sql.Connection**/public static Connection getSqlConnection() throws Exception{//1、加载配置文件InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("jdbc.properties");Properties pros = new Properties();pros.load(is);//2、读取配置信息String user = pros.getProperty("user");String password = pros.getProperty("password");String url = pros.getProperty("url");String driverClass = pros.getProperty("driverClass");//3、加载驱动Class.forName(driverClass);//4、获取连接Connection conn = DriverManager.getConnection(url, user, password);return conn;}/*** @Description 关闭连接和Statement资源* @Param [conn, ps]* @return void**/public static void closeResource(Connection conn, Statement ps){try {if (ps != null) ps.close();} catch (SQLException e) {e.printStackTrace();}try {if (conn != null) conn.close();} catch (SQLException e) {e.printStackTrace();}}public static void closeResource(Connection conn, Statement ps, ResultSet res){try {if (ps != null) ps.close();} catch (SQLException e) {e.printStackTrace();}try {if (conn != null) conn.close();} catch (SQLException e) {e.printStackTrace();}try {if (res != null) res.close();} catch (SQLException e) {e.printStackTrace();}}/*** @Description 通用增删改操作2.0* @Param* @return**/public static int updateDate(Connection conn, String sql, Object... args) {PreparedStatement ps = null;try {//预编译sql语句,获取PreparedStatement实例ps = conn.prepareStatement(sql);//填充占位符for (int i = 0; i < args.length; i++) {ps.setObject(i + 1, args[i]);}//执行操作return ps.executeUpdate(); //返回操作的字段数,没有则为0} catch (Exception e) {e.printStackTrace();}finally {//关闭资源closeResource(null, ps);}return 0;}
}

三、事务的ACID属性

1、原子性(Atomicity) 原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。

2、一致性(Consistency) 事务必须使数据库从一个一致性状态变换到另外一个一致性状态。

3、隔离性(Isolation) 事务的隔离性是指一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。

4、持久性(Durability) 持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来的其他操作和数据库故障不应该对其有任何影响。


四、数据库的隔离级别

对于同时运行的多个事务,当这些事务访问数据库中相同的数据时,如果没有采取必要的隔离机制,就会导致各种并发问题:

①脏读:对于两个事务 T1和T2,T1 读取了已经被 T2 更新但还没有被提交的字段。之后,若 T2 回滚,T1读取的内容就是临时且无效的。
②不可重复读:对于两个事务T1和T2,T1 读取了一个字段,然后 T2 更新了该字段。之后,T1再次读取同一个字段,值就不同了。
③幻读:对于两个事务T1和T2,T1 从一个表中读取了一个字段,然后 T2 在该表中插入了一些新的行。之后,如果 T1 再次读取同一个表,就会多出几行。

数据库事务的隔离性:数据库系统必须具有隔离并发运行各个事务的能力,使它们不会相互影响,避免各种并发问题。

一个事务与其他事务隔离的程度称为隔离级别。数据库规定了多种事务隔离级别,不同隔离级别对应不同的干扰程度, 隔离级别越高, 数据一致性就越好,但并发性越弱。

Mysql 4种隔离级别:
在这里插入图片描述

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


五、设置隔离级别

案例:一个线程查询,另一个线程更新,当更新的线程尚未提交时查询的为初始的值,提交后查询到的为更新后的值。(这里将隔离级别设置为READ_COMMITTED

测试类:

package jdbc;import javabean.User;
import utils.Query;
import utils.jdbcUtils;import java.sql.Connection;
import java.util.List;/*** @Author: Yeman* @Date: 2022-01-30-22:27* @Description:*/
public class TransactionTest {public static void main(String[] args) {//用于更新的线程TransactionThread transactionThread = new TransactionThread();Thread thread = new Thread(transactionThread);thread.start();//用于查询的线程Connection conn = null;try {conn = jdbcUtils.getSqlConnection();String sql = "select user,password,balance from user_table where user = ?";//设置隔离级别为提交可读conn.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);List<User> query1 = Query.Query(conn, User.class, sql, "CC");query1.forEach(System.out :: println);//延迟5秒后再次查询Thread.sleep(5000);List<User> query2 = Query.Query(conn,User.class,sql,"CC");query2.forEach(System.out :: println);} catch (Exception e) {e.printStackTrace();}finally {jdbcUtils.closeResource(conn,null);}}
}

用于更新的线程类:

package jdbc;import utils.jdbcUtils;import java.sql.Connection;/*** @Author: Yeman* @Date: 2022-01-30-22:47* @Description:*/
public class TransactionThread implements Runnable{@Overridepublic void run() {Connection conn = null;try {conn = jdbcUtils.getSqlConnection();//取消自动提交conn.setAutoCommit(false);String sql = "update user_table set balance = ? where user = ?";jdbcUtils.updateDate(conn,sql,5000,"CC");//设置延迟3秒后再提交Thread.sleep(3000);conn.commit();} catch (Exception e) {e.printStackTrace();}finally {jdbcUtils.closeResource(conn,null);}}
}

工具类utils同上案例

测试结果:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/347428.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于VS的连连看小游戏

运行环境 Matlab R2018b x64 or x32 Visual Studio 2017 企业版 程序预览 目前功能只开发了基本模式,也即是基本的连连看功能和帮助功能,文末有完整程序代码下载地址,有任何问题欢迎留言,谢谢点赞哟! 重要设计步骤和思路以及实现如下所示。 设计思路 类设计

idea使用c3p0数据库连接池无法加载配置文件xml,配置文件放置的位置

注意&#xff1a;要把c3p0-config.xml文件放在输出的文件夹里面&#xff0c;即放在out里面&#xff0c;而不是放在src里面。&#xff08;如下图&#xff09; 至于配置文件怎么写&#xff0c;可以参考其他经验教程&#xff0c;这里不再赘述。

spring boo_为您的下一个基于Spring的应用程序考虑使用spring-boot的原因!

spring booSpring-boot提供了一种创建基于Spring的应用程序的快速方法。 对于下一个项目&#xff0c;有一些非常令人信服的理由考虑使用Spring-boot&#xff1a; 原因1&#xff1a;使用spring-boot启动程序项目进行更简单的依赖性管理。 考虑使用CR2是使用h2数据库来实现的&am…

自适应滤波实例之系统辨识

实验模型 x(n):随机信号,服从N(0,1)分布 h(n):未知的系统响应(由5阶FIR低通滤波器模拟) h=[0.2,0.5,0.7,-0.5,0.2]; d(n):期望信号,d(n)=x(n)*h(n) 目标:根据接收端接收信号r(n)(此时即为期望信号d(n))和训练序列x’(n)求未知的h(n) LMS实验结果 设自适应滤波器…

jdbc数据库连接池C3P0和Druid德鲁伊,Java与MySQL数据库交互

文章目录一、 连接池的必要性二、数据库连接池技术三、多种开源的数据库连接池四、C3P0数据库连接池五、Druid&#xff08;德鲁伊&#xff09;数据库连接池六、C3P0和Druid驱动jar包一、 连接池的必要性 在使用开发基于数据库的web程序时&#xff0c;传统的模式基本是按以下步…

使用Spring Boot构建REST Web服务

本教程提供了有关如何使用Spring Boot构建Restfull Web服务的分步指南。 先决条件&#xff1a; Eclipse IDE&#xff08;最新版本&#xff09; Maven的4 Java 1.8 1.创建Maven Web项目 打开eclipse&#xff0c;然后创建一个新的Maven Web项目&#xff0c;并将其命名为Spri…

Apache-DBUtils实现CRUD操作,已封装的API实现jdbc对数据库进行操作

文章目录一、Apache-DBUtils简介二、主要API的使用1、DbUtils类2、QueryRunner类3、ResultSetHandler接口及实现类三、Apache-DBUtils驱动下载一、Apache-DBUtils简介 commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库&#xff0c;它是对JDBC的简单封装&#xff0c…

自适应滤波实例之系统逆辨识(以及系统零极点对逆辨识效果的影响分析)

实验模型 x(n):随机信号,服从N(0,1)分布 h(n):未知的系统响应(由10阶FIR低通滤波器模拟) h=[0.03,-0.04,0.06,-0.2,-0.5,0.75,0.37,0.24,0.01,0.06]; d(n):期望信号,d(n)=x(n)*h(n) 目标:根据接收端接收信号r(n)和训练序列x’(n) (此时即为期望信号d(n)),求未知…

卡尔曼滤波实例之系统逆辨识

实验模型 x(n):随机信号,服从N(0,1)分布 h(n):未知的系统响应(由10阶FIR低通滤波器模拟) h=[0.03,-0.04,0.06,-0.2,-0.5,0.75,0.37,0.24,0.01,0.06]; d(n):期望信号,d(n)=x(n)*h(n) 目标:根据接收端接收信号r(n)和训练序列x’(n) (此时即为期望信号d(n)),求未知…

static和瞬态_具有瞬态属性的视图对象的钝化和激活

static和瞬态在应用程序模块的钝化/激活周期内&#xff0c;框架也将钝化并激活视图对象。 通常&#xff0c;框架保存有关VO状态&#xff0c;当前行&#xff0c;绑定变量值等的信息。 但是没有数据。 激活视图对象后&#xff0c;将重新执行VO的查询&#xff0c;并重新获取数据。…

你是不是已经超纲了?一文解决JavaWeb中要求的HTML,是什么样的?

文章目录一、正经的开始 &#x1f469;&#x1f3fb;&#x1f469;&#x1f3fb;&#x1f469;&#x1f3fb;二、HTML简介1、HTML“化简为繁”2、超文本“醉翁之意”3、标记“画地为牢”4、永远的HelloWorld5、HTML文件“解衣”6、HTML“潜规则”三、使用HTML展示文章1、标题“…

自适应滤波实例之噪声抵消

实验模型 s(n)是立体声音乐信号,fs=8kHz,平均功率为0.0047; v(n)是零均值高斯白噪声,方差为1; h(n)是由5阶FIR低通滤器模拟,带宽为[0, 0.35fs]; 目标:d(n)中包含音乐信号s’(n)和白噪声v’(n),v’(n)为v(n)经过系统h(n)后的输出,则x(n)=v(n)与v’(n)具有相关性,利…

初学JavaWeb,前端css要不要了解一下啊?一文学会JavaWeb中css的简单应用

文章目录一、设置CSS样式二、CSS代码语法三、CSS选择器四、css文档手册分享关于JavaWeb中的HTML&#xff1a;《你是不是已经超纲了&#xff1f;一文解决JavaWeb中要求的HTML&#xff0c;是什么样的&#xff1f;》 一、设置CSS样式 有三种设置方式。 1、在HTML标签内设置&#…

了解Java中的可克隆接口

什么是对象克隆&#xff1f; 对象克隆是生成具有不同名称的对象的精确字段到字段副本的过程。 克隆的对象在内存中有自己的空间&#xff0c;可在其中复制原始对象的内容。 这就是为什么在克隆后更改原始对象的内容时&#xff0c;所做的更改不会反映在克隆对象中的原因。 我们可…

堆栈图解CSAPP Bomb Lab实验解析

CSAPP Bomb Lab 实验解析 Bomblab是csapp的第二个配套实验&#xff0c;该实验提供了一个bomb二进制文件和一个bomb.c源文件&#xff0c;我们的目标是运行bomb并按照提示一步步输入字符串&#xff0c;直到完成整个拆炸弹的流程。但是源文件中只提供了部分代码&#xff0c;所以我…

初学JavaWeb需要的前端js,JavaScript是什么样的?

文章目录一、JavaScript简介二、HelloWorld三、JavaScript基本语法四、DOM五、JavaScript事件驱动六、网页制作完全手册分享关于HTML和css详见&#xff1a;《JavaWeb中的HTML和css》 一、JavaScript简介 1、起源 1995年&#xff0c;JavaScript由Netscape公司的Brendan Eich在网…

OD汇编指令集(不断更新)

一、快捷键 F7 执行一行代码&#xff0c;遇到 CALL 等子程序时会进入其中&#xff0c;进入后首先会停留在子程序的第一条指令上。 F8 执行一行代码&#xff0c;遇到 CALL 等子程序不进入其代码。 F2 在显著行设置断点&#xff0c;再次按 F2 删除断点。 F9 F9运行调试程序&…

踩坑+排雷新版IDEA2021.1创建配置Javaweb项目并部署在Tomcat容器,完整详细

前些天发现了十分不错的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;没有广告&#xff0c;分享给大家&#xff0c;大家可以自行看看。&#xff08;点击跳转人工智能学习资料&#xff09; 微信公众号&#xff1a;创享日记 发送&#xff1a;tomcat 获取…

微机原理实验1:字符串匹配程序实验

一、实验目的 1&#xff0e;掌握分支程序的设计方法。 2&#xff0e;熟悉在PC机上建立、汇编、链接、调试和运行8086汇编程序的过程。 二、实验内容 1&#xff0e;比较两个字符串STRING1和STRING2所含的字符是否相同&#xff0c;若相同则显示‘Match’&#xff0c;否则显示‘…

终于让Web前端和Tomcat(Java服务器)和MySQL(数据库)连在一起了

文章目录一、先在Web前端来个表单二、添加Tomcat依赖三、引入jdbc和dbutils四、编写Servlet类五、关联模块《踩坑排雷新版IDEA2021.1创建配置Javaweb项目并部署在Tomcat容器》 一、先在Web前端来个表单 如图在web项目目录下创建一个html文件。 文件内容可以参考如下。 <!D…