事务+事务的四大特性+隔离性的具体分析+数据库连接池

Javaweb-JDBC进阶-事务与连接池详细学习笔记 Javaweb-JDBC进阶-事务与连接池 事务 银行转账!张三转1000块到李四的账户,这其实需要两条SQL语句: 给张三的账户减去1000元 给李四的账户加上1000元 如果在第一条SQL语句执行成功后,在执行第二条SQL语句之前,程序被中断了(可能是抛出了某个异常,也可能是其他什么原因),那么李四的账户没有加上10000元,而张三却减去了10000元,这肯定是不行的! 你现在可能已经知道什么... 阅读详情
一、事务
1.事务的概念:事务是指逻辑上的一组操作,这组操作要么同时完成要么同时不完成。参考转账操作。
2.如果你自己不去控制事务,数据库默认一条sql语句就处在自己单独的事务当中。
3.也可以使用命令去开启一个事务:
start transaction;--开启事务,这条语句之后的sql语句将处在一个事务当中,这些sql语句并不会立即执行
Commit--提交事务,一旦提交事务,事务中的所有sql语句才会执行。
Rollback -- 回滚事务,将之前所有的sql取消。

conn.setAutoCommit(false);
conn.commit();
conn.rollback();
conn.setSavePoint();
conn.rollback(sp);

4.事务的四大特性ACID
~原子性:事务的一组操作是原子的不可再分割的,这组操作要么同时完成要么同时不完成。
~一致性: 事务在执行前后数据的完整性保持不变。数据库在某个状态下符合所有的完整性约束的状态叫做数据库具有完整性。在解散一个部门时应该同时处理员工表中的员工保证这个事务结束后,仍然保证所有的员工能找到对应的部门,满足外键约束。
~隔离性:当多个事务同时操作一个数据库时,可能存在并发问题,此时应保证各个事务要进行隔离,事务之间不能互相干扰。
~持久性:持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,不能再回滚。

5.事务的隔离性导致的问题(所有的问题都是在某些情况下才会导致问题)
~脏读:一个事务读取到了另一个事务未提交的数据。 
1 | a    |  1000
  2 | b    |  1000
 
  b--->a
  start transaction;
  update account set money=money-100 where name='b';
update account set money=money+100 where name='a';
rollback;


select * from account where name = 'a';1000 1000

~不可重复读:在一个事务内读取表中的某一行数据,多次读取结果不同.
start transaction:
活期存款:1000
定期存款:1000
固定资产: 2000
--------------
开启事务
取走获取存款1000
提交事务
--------------
总资产:3000

~幻读(虚读):一个事务读取到了另一个事务插入的数据(已提交)
a 2000
b 2000
c 2000
start transaction;
select sum(money) from account;6000
--------------
开启事务
创建一个账户并存入1000块钱
提交了事务
--------------
select count(*)from account;4
avgMoney = allMoney/count;6000/4=1500

6.数据库的隔离级别
~Read uncommitted:如果将数据库设定为此隔离级别,数据库将会有脏读、不可重复度、幻读的问题。
~Read committed:如果将数据库设定为此隔离级别,数据库可以防止脏读,但有不可重复度、幻读的问题。
~Repeatable read: 如果将数据库设定为此隔离级别,数据库可以防止脏读、不可重复度,但是不能防止幻读。
~Serializable:将数据库串行化,可以避免脏读、不可重复读、幻读。

安全性来说:Serializable>Repeatable read>Read committed>Read uncommitted
效率来说:Serializable<Repeatable read<Read committed<Read uncommitted
通常来说,一般的应用都会选择Repeatable read或Read committed作为数据库隔离级别来使用。
mysql默认的数据库隔离级别为:REPEATABLE-READ

如何查询当前数据库的隔离级别?select @@tx_isolation;
如何设置当前数据库的隔离级别?set [global/session] transaction isolation level ...;
~此种方式设置的隔离级别只对当前连接起作用。
set transaction isolation level read uncommitted;
set session transaction isolation level read uncommitted;
~此种方式设置的隔离级别是设置数据库默认的隔离级别
set global transaction isolation level read uncommitted;

7.做实验,演示脏读、不可重复度、幻读
~演示脏读
~演示不可重复度
~演示幻读:幻读有可能发生有可能不发生,但是一旦发生就可能造成危害。
~演示Serializable:基于锁机制运行

8.锁机制:
共享锁:共享锁和共享锁可以共存。
排他锁:排他锁和所有锁都不能共存。
在非串行化下,所有的查询都不加锁,所有的修改操作都会加排他锁。
在串行化下,所有的查询都加共享锁,所有的修改都加排他锁。
死锁

9.更新丢失
如果多个线程操作,基于同一个查询结构对表中的记录进行修改,那么后修改的记录将会覆盖前面修改的记录,前面的修改就丢失掉了,这就叫做更新丢失。
Serializable可以防止更新丢失问题的发生。其他的三个隔离级别都有可能发生更新丢失问题。
Serializable虽然可以防止更新丢失,但是效率太低,通常数据库不会用这个隔离级别,所以我们需要其他的机制来防止更新丢失:

乐观锁和悲观锁不是数据库中真正存在的锁,只是人们在解决更新丢失时的不同的解决方案,体现的是人们看待事务的态度。
悲观锁:
隔离级别不设置为Serializable,防止效率过低。
在查询时手动加上排他锁。
如果数据库中的数据查询比较多而更新比较少的话,悲观锁将会导致效率低下。

乐观锁:
在表中增加一个version字段,在更新数据库记录是将version加一,从而在修改数据时通过检查版本号是否改变判断出当前更新基于的查询是否已经是过时的版本。
如果数据库中数据的修改比较多,更新失败的次数会比较多,程序需要多次重复执行更新操作。





二、数据库连接池
1.连接池概念:
2.自己写一个连接池:
使自己的连接池在conn调用close方法是可以将连接直接返回池中:
修改一个类中某个方法的功能:
继承
装饰设计模式模式
动态代理

3.开源数据库连接池:
(1)DBCP
BasicDataSource dataSource = new BasicDataSource();
String path = this.getClass().getClassLoader().getResource("dbcp.properties").getPath();
Properties prop = new Properties();
prop.load(new FileInputStream(path));
DataSource dataSource = BasicDataSourceFactory.createDataSource(prop);
配置文件属性:
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/jdbc
username=root
password=

#<!-- 初始化连接 -->
initialSize=10

#最大连接数量
maxActive=50

#<!-- 最大空闲连接 -->
maxIdle=20

#<!-- 最小空闲连接 -->
minIdle=5

#<!-- 超时等待时间以毫秒为单位 6000毫秒/1000等于60秒 -->
maxWait=60000

(2)C3P0
ComboPooledDataSource dataSource = new ComboPooledDataSource();
ComboPooledDataSource dataSource = new ComboPooledDataSource("mySoruce");
<?xml version="1.0"?>
<c3p0-config>
 <default-config>
<property  name="driverClass">com.mysql.jdbc.Driver</property >
<property name="jdbcUrl">jdbc:mysql:///Day12</property >
<property name="user">root</property>
<property name="password">root</property>
 </default-config>

 <!-- This app is massive! -->
 <named-config name="mySoruce"> 
  <property  name="driverClass">com.mysql.jdbc.Driver</property >
<property name="jdbcUrl">jdbc:mysql:///Day12</property >
<property name="user">root</property>
<property name="password">root</property>
 </named-config>
</c3p0-config>

driverClass
jdbcUrl
user
password
acquireIncrement:当连接池中已经没有连接时,连接池自动获取连接时一次获取的连接个数。
initialPoolSize:连接池初始化时,获取连接的个数。
maxPoolSize:连接池可以保有的最大的连接的数量。
maxIdleTime:当连接空闲多久时释放连接。如果该时间值设置问为0,表示从不释放连接。
minPoolSize:连接池应该保有的最小的连接的数量。


4.tomcat内置的数据源:tomcat内置了DBCP数据源
<1>在tomcat的安装目录下的lib目录下导入数据库驱动包
<2>在Context中配置数据源,有五个位置可以配置,参考tomcat文档
~在conf/context.xml爸爸Context中配置,这个配置将被tomcat的所有web应用共享
In the $CATALINA_BASE/conf/context.xml file: the Context element information will be loaded by all webapps.
~在conf/Catalina/localhost/context.xml,这个配置将被当前虚拟主机所共享
In the $CATALINA_BASE/conf/[enginename]/[hostname]/context.xml.default file: the Context element information will be loaded by all webapps of that host.
~在conf/Catalina/localhost/XXXXXX.xml,这是配置web应用的对外访问路径,这个配置只对当前web应用起作用
In individual files (with a ".xml" extension) in the $CATALINA_BASE/conf/[enginename]/[hostname]/ directory. The name of the file (less the .xml extension) will be used as the context path. Multi-level context paths may be defined using #, e.g. foo#bar.xml for a context path of /foo/bar. The default web application may be defined by using a file called ROOT.xml.
~在web应用个的META-INF目录下创建context.xml这个配置只对当前web应用起作用
Only if a context file does not exist for the application in the $CATALINA_BASE/conf/[enginename]/[hostname]/, in an individual file at /META-INF/context.xml inside the application files. If the web application is packaged as a WAR then /META-INF/context.xml will be copied to $CATALINA_BASE/conf/[enginename]/[hostname]/ and renamed to match the application's context path. Once this file exists, it will not be replaced if a new WAR with a newer /META-INF/context.xml is placed in the host's appBase.
~在conf/servler.xml的Host标签下配置Context标签
Inside a Host element in the main conf/server.xml.
<3>在Cotext中配置:
 <Resource name="mySource"  ---在数据源创建好以后绑定到jndi容器中时使用的名字
            auth="Container" 
            type="javax.sql.DataSource" ---当前对象的类型,默认就是数据源
            username="root"  --- 数据库用户名
            password="root"  --- 数据库密码
            driverClassName="com.mysql.jdbc.Driver" ---数据库驱动名
            url="jdbc:mysql:///day12" --- 数据库连接信息
            maxActive="8" --- 最大连接数
            maxIdle="4"/> --- 最大空闲连接数
   <4>在程序中获取数据源:
  Context context = new InitialContext();
Context envCtx = (Context)context.lookup("java:comp/env"); 
DataSource datasource = (DataSource) envCtx.lookup("mySource");
宇树机器狗go2—slam建图(1)点云格式 上一篇番外文章教大家如何在宇树机器狗go2的gazebo仿真环境中实现简单的导航运动,本期文章会教大家如何让宇树的机器狗go2在仿真环境中进行slam建图时经常会遇到的一些点云格式,在后续的slam建图和slam算法解析的时候会经常与这些点云信息打交道。宇树机器狗go2仿真会作为一个长期项目来进行不定期更新,仿真不只限于在gazebo上实现,后面还会在isaac sim等仿真平台上教大家如何搭建,其目的还是帮助各位都能以较低的成本加入到宇树机器狗go2的学习中。 阅读详情

相关推荐

Electron多窗口开发避坑指南:Pinia状态同步的3种解决方案对比

本文深入探讨了在Electron多窗口应用中实现Pinia状态同步的三种核心方案。针对Electron多窗口架构下状态隔离的挑战,文章对比了基础事件通信、共享存储以及智能Pinia插件等方案的优劣与适用场景,并提供了生产级的实现指南与选型建议,帮助开发者构建健壮高效的桌面应用。

spice的博客 479

MySQL事务之丢失更新问题

在事务的并发操作中,也就是多个事务同时对同一组数据进行操作时,可能会出现脏读、不可重复读、幻读、丢失更新这四个问题,本篇博客就来为大家讲解 丢失更新 问题。 丢失更新 就是两个事务在并发下同时进行更新,后一个事务的更新覆盖了前一个事务更新的情况,丢失更新是数据没有保证一致性导致的。比如,事务A 修改了一条记录,事务B 在 事务A 提交的同时也进行了一次修改并且提交。当事务A查询的时候,会发现刚才修改的内容没有被修改,好像丢失了更新。

小异常的博客 1万+

告别复杂配置:dbswitch vs 传统工具(Kettle/DataX)在Greenplum数据同步中的性能对比

本文深入对比了新兴工具dbswitch与传统ETL工具Kettle、DataX在Greenplum数据同步中的表现。重点分析了dbswitch如何通过免中间文件、利用二进制COPY协议等设计,在异构数据库同步场景下实现更优的性能和更简化的配置,为技术选型提供清晰参考。

transformer2023的博客 1046

数据库事务二阶段提交(更新丢失问题)问题复现和解决

更新丢失 二阶段提

- 403

WSL2 + Open3D点云可视化踩坑全记录:从GLFW报错到VcXsrv配置,一篇讲清所有‘坑’

本文详细解析了在WSL2环境中使用Open3D进行点云可视化时遇到的常见问题,特别是GLFW报错和VcXsrv配置问题。通过系统性的解决方案和高级配置技巧,帮助开发者彻底解决图形显示、驱动加载和库版本冲突等难题,实现高效的点云可视化。

weixin_30627341的博客 101

OCR开发实战:如何用PaddleOCR C++版实现本地文字识别(附模型文件处理技巧)

本文详细介绍了如何使用PaddleOCR C++版实现本地文字识别,包括环境搭建、工程编译、运行时优化等全流程。重点讲解了在VS2019/VS2022环境下配置PaddleOCR的CPU推理性能优化技巧,以及模型文件处理的实际应用方法,帮助开发者高效完成OCR本地化部署。

devops8pract的博客 335

带你搞懂MySQL隔离级别,两个事务同时操作同一行数据会怎样?

最近有学生出去面试,被问到这样一个题目【**。,**

m0_67391401的博客 3808

Floyd (弗洛伊德)算法简述

Floyd在1962年由Robert Floyd以其当前公认的形式出版。算法作为三个嵌套for循环的现代公式首先由Peter Ingerman在1962年描述。Floyd 算法是解决图论问题的比较经典的算法,是解决给定的加权图中顶点间的最短路径的一种算法,可以正确处理有向图的最短路径问题。

慕羽★的博客 2万+

数据库事务,spring事务,数据库连接池的回顾

(1)什么是连接池池(pool)技术在一定程度上可以明显优化服务器应用程序的性能,提高程序执行效率和降低资源开销。这里所说的是一种广义上的池,比如说数据库连接池,线程池,内存池,对象池等。其中,对象池可以看成保存对象的容器,在进行初始化的时候创建一定数量的对象,在需要的时候直接从池中取出一个空闲的对象,用完后并不直接释放对象,而是将对象放回对象池中以方便下一次对对象请求的复用。其中几种池的设计思想也是如此,池技术的优势是可以消除对象创建带来的延迟,从而提高系统性能。(2)为什么要使用连接池。

sp2ecter的博客 992

[QMT和ptrade量化交易小白入门]-109、小市值选股的基础上用六脉神剑评分,回测年化可到132%

本专栏主要是介绍QMT和ptrade的基础用法,常见函数,写策略的方法,也会分享一些量化交易的思路,大概会写200篇左右。QMT的相关资料较少,在使用过程中不断的摸索,遇到了一些问题,记录下来和大家一起沟通,共同进步。

木头大左的博客 1862

RH850系列芯片深度剖析 1.5-链接(ld)文件解析

基础编译过程分为四个阶段:预处理(Preprocessing)、编译(Compilation)、汇编(Assembly)、链接(Linking)。执行这四个阶段的程序(预处理器、编译器、汇编器、和链接器)一起构成了编译系统。CONSTANTS接下来的内存空间定义部分会使用这些常量来定义内存空间的范围,理论上来说不定义常量也没有影响,直接用魔鬼数字代替,定义常量的主要目的就是方便理解以及方便修改;从示例中可以看出,常量的值可以为16进制或者10十进制,而且10进制支持数量级单位(k级,M级);

本博客专注于嵌入式软件领域技术分享。 1427

懂事务与数据库连接池

事务保证数据一致性,核心是 ACID 特性和隔离级别配置,实际开发中需结合 JDBC 或框架(Spring)使用。连接池优化系统性能,Druid 是最优选择,通过配置文件 + 工具类可快速集成。两者结合时,需重点关注连接的唯一性和归还时机,避免事务失效或连接泄漏。掌握这两项技术,能解决大部分数据库相关的性能和数据一致性问题,是 Java 后端开发的必备技能。

asad6的博客 1089

Vue3 - Element Plus上传组件el-upload上传多个文件时,让on-change监听事件仅执行一次并获取最终文件列表方法(开启多选文件并手动上传,拿到文件列表统一循环调用接口上传)

vue3,elementplus,Upload上传,el-upload,文件上传组件,上传组件on-change里执行多次,取消自动上传后change重复执行问题,upload上传多个文件后导致on-change执行多次拿不到最终文件列表,Element-plus的upload组件on-change不断执行怎么办,上传多个文件多次执行调用,上传多个文件时如何只执行一次on-change方法拿到最终的文件列表,vue3elementplus上传组件开启多个上传后导致change方法执行好几次,仅调用一

🏆 前端领域优质创作者 1万+

事务与数据库连接池

1.概述:了解什么是事务事务是数据库提供的一个特性。事务:组成各个数据的执行的单元,要么都成功,要么都不成功。2.转账的例子转账的功能,冠希给美美转1000元钱。使用事务先给冠希扣除掉1000元再给美美加上1000元事务结束了。

开往1982的博客 789

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

【Go数据库事务管理全解析】:彻底搞懂隔离级别与事务控制

掌握Go语言数据库操作中的事务管理精髓,深入解析隔离级别与事务控制机制。涵盖实际应用场景、核心方法及并发处理优势,帮助开发者避免脏读、幻读等问题,提升数据一致性与系统可靠性,值得收藏。

PixelStream的博客 845

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

事务(理解)与数据库连接池

事务是数据库提供的一个特性。事务:组成各个数据的执行的单元,要么都成功,要么都不成功。举例:转账的功能,冠希给美美转1000元钱。使用事务先给冠希扣除掉1000元再给美美加上1000元事务结束了。

2403_87486006的博客 1142

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

JDBC数据库事务&&数据库连接池

DBC 的数据库连接池使用 javax.sql.DataSource 来表示,DataSource只是一个接口,该接口通常由服务器(Weblogic, WebSphere, Tomcat)提供实现,也有一些开源组织提供实现。DataSource 通常被称为数据源,它包含连接池和连接池管理两个部分,习惯上也经常把 DataSource 称为连接池。Tomcat 的连接池正是采用该连接池来实现的。该数据库连接池既可以与应用服务器整合使用,也可由应用程序独立使用。......

qq_43408367的博客 728

事务和数据库连接池

事务 事务的四大特性:ACID; mysql中操作事务 jdbc中操作事务 事务概述 为了方便演示事务,我们需要创建一个account表: CREATE TABLE account( id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(30), balance NUMERIC(10.2) ); INSERT INTO account(NAME,b...

u013814522的博客 614

深入理解事务与数据库连接池:从理论到实战

扣减你的账户余额增加对方账户余额这两个操作必须要么全部成功,要么全部失败,这就是事务的核心思想——原子性(Atomicity)。事务是数据库管理系统(DBMS)提供的机制,用于确保一组数据库操作的完整性。明确事务边界:尽量在业务层(Service)控制事务。合理设置隔离级别:默认使用数据库配置(如MySQL的REPEATABLE READ),必要时调整。避免长事务:及时提交或回滚,减少锁竞争。

wertuiop_的博客 589

事务以及数据库连接池

事务事务的概念事务是指逻辑上的一组操作,这组操作要么同时完成要么同时不完成.事务的管理默认情况下,数据库会自动管理事务,管理的方式是一条语句就独占一个事务. 如果需要自己控制事务也可以通过如下命令开启/提交/回滚事务 start transaction; commit; rollback;JDBC中管理事务: conn.setAutoCommit(false); conn.commit(

翻滚吧,安卓! 1171

事务与连接池

事务与连接池事务事务介绍事务的概念事务指逻辑上的一组操作,组成这组操作的各个单元,要不全部成功,要不全部不成功数据库开启事务命令start transaction  开启事务Rollback  回滚事务Commit   提交事务 Mysql中使用事务1.创建表create table account(   id int primary key auto_increment,   name varc...

从放弃到开始 2473

WEB基础--数据库事务与连接池

事务(Transaction,简写为tx):在数据库中,所谓事务是指一组逻辑操作单元,使数据从一种状态变换到另一种状态。为确保数据库中数据的一致性,数据的操纵应当是离散的成组的逻辑单元:当每个逻辑操作单元全部完成时,数据的一致性可以保持,而当这个单元中的一部分操作失败,整个事务应全部视为错误,所有从起始点以后的操作应全部回退到开始状态。

qq_56438516的博客 810

MySQL的事务、连接池以及数据源

事务:逻辑上的一组操作,要么都执行,要么都不执行 举个例子:A向B转账1000,那么A的账户需要减少1000,B的账户需要增加1000,在数据库底层这是两个更新操作。在这个过程中,两个更新操作必须全部执行成功或者失败,否则A和B谁也不乐意。 MySQL: 1.支持事务的,默认会自动提交事务。每条语句都在一个单独的事务中 2.手动控制事务: 开启事务:start transaction | be

Just The Way You Are 1384

事务连接池

事务是数据库提供的一种特性,用于确保数据操作的完整性和一致性。事务将多个数据操作组合成一个逻辑单元,这些操作要么全部成功,要么全部失败。事务的隔离级别用于控制事务之间的隔离程度,以解决并发操作中可能出现的问题,如脏读、不可重复读和幻读。数据库连接池是一种资源管理技术,用于高效管理和复用数据库连接。连接池预先创建一定数量的数据库连接,并在需要时将这些连接分配给请求者,使用完毕后归还到池中。通过使用事务,可以确保数据操作的完整性和一致性。在MySQL中,可以通过COMMIT和ROLLBACK命令操作事务。

lyx20020823的博客 871
上一篇: JDBC相关的知识点+大数据处理+防止sql注入攻击
下一篇: DBUtils框架+客户管理系统的设计与开发
escdelete
博客等级 码龄14年 37粉丝 69原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值