网站首页 > 技术文章 正文
Mysql事务
事务:
事务指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部不成功。
- 1.1 Mysql中的事务
a、mysql引擎是支持事务的
b、mysql默认自动提交事务。每条语句都处在单独的事务中。
c、手动控制事务
开启事务:start transaction | begin
提交事务:commit
回滚事务:rollback
- 1.2 JDBC如何控制事务
Connection conn = null;
PreparedStatement ps = null;
try{
conn = DBUtils.getConnection();
conn.setAutoCommit(false); //相当于begin
ps.conn.prepareStatement("update account set money=money-100 where id=1");
ps.executeUpdate();
ps = conn.prepareStatement("update account set money=money+100 where id=2");
ps.executeUpdate();
conn.commit(); //提交事务 commit
}catch(Exception e){
try{
conn.rollback(); //回滚事务 rollback
}catch(SQLException e1){
e1.printStackTrace();
}
e.printStackTrace();
}finally{
DBUtils.closeAll(null, ps, conn);
}
- 1.3 事务的特性(面试题)
原子性:指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
一致性:事务必须使数据库从一个一致性状态变换到另外一个一致性状态。转账前和转账后的总金额不变。
隔离性:事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。
持久性:指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。
- 1.4 事务的隔离级别
赃读:指一个事务读取了另一个事务未提交的数据。
不可重复读:在一个事务内读取表中的某一行数据,多次读取结果不同。一个事务读取到了另一个事务提交后的数据.(update)
虚读(幻读):是指在一个事务内读取到了别的事务插入的数据,导致前后读取不一致。 (insert)
数据库通过设置事务的隔离级别防止以上情况的发生:
- READ UNCOMMITTED:赃读、不可重复读、虚读都有可能发生。
- READ COMMITTED:避免赃读。不可重复读、虚读都有可能发生。(oracle默认的)
- REPEATABLE READ:避免赃读、不可重复读。虚读有可能发生。(mysql默认)
- SERIALIZABLE:避免赃读、不可重复读、虚读。
级别越高,性能越低,数据越安全
mysql中:
查看当前的事务隔离级别:SELECT @@TX_ISOLATION;
更改当前的事务隔离级别:SET TRANSACTION ISOLATION LEVEL 四个级别之一。
设置隔离级别必须在事务之前
- 1.5 JDBC控制事务的隔离级别
Connection.setTransactionIsolation(int level);
数据库连接池
- 2.1 连接池原理:(面试)
目的:解决建立数据库连接耗费资源和时间很多的问题,提高性能。
- 2.2 编写标准的数据源
自定义数据库连接池要实现javax.sql.DataSource接口,一般都叫数据源。
public class MyDataSource implements DataSource{
//存放连接的池子
private static LinkedList<Connection> pool = new LinkedList<>();
//创建10个连接放在池中
static{
for(int i = 0; i < 10; i++){
Connection conn = null;
try{
conn = JdbcUtil.getConnection();
pool.addLast(conn);
}catch(SQLException e){
e.printStackTrace();
}
}
}
public Connection getConnection() throws SQLException{
if(pool.size() > 0){
Connection conn = pool.removeFirst();
return conn;
}else{
//等待
//新创建一个连接
throws new RuntimeException("服务器忙。。。");
}
}
}
- 2.3 编写数据源时遇到的问题及解决办法
a、装饰设计模式:使用频率很高
目的:改写已存在的类的某个方法或某些方法,装饰设计模式(包装模式)
口诀:
- 编写一个类,实现与被包装类相同的接口(具备相同的行为)
- 定义一个被包装类类型的变量
- 定义构造方法,把被包装类的对象注入,给被包装类变量赋值
- 对于不需要改写的方法,调用原有的方法
- 对于需要改写的方法,写自己的代码
b、默认适配器:装饰设计模式一个变体
口诀:
- 编写一个类,继承包装类适配器(具备相同的行为)
- 定义一个被包装类类型的变量
- 定义构造方法,把被包装类的对象注入,给被包装类变量赋值
- 对于不需要改写的方法,调用原有的方法
- 常用的数据源配置(日后都使用数据源,一定要配置一下)
1)DBCP
DBCP:Apache推出的Database Connection Pool
使用步骤:
- 添加jar包 commons-dbcp-1.4.jar commons-pool-1.5.6.jar
- 添加属性资源文件
- 编写数据源工具类
public class DBCPUtils{
//声明一个连接池对象
private static DataSource ds;
static{
Properties p = new Properties();
try{
p.load(DBCPUtils.class.getClassLoader().getResourceAsStream("dbcpconfig.properties"));
ds.BasicDataSourceFactory(p);
}catch(Exception e){
e.printStackTrace();
}
}
public static Connection(){
try{
return ds.getConnection();
}catch(SQLException e){
throw new RuntimeException("创建数据库连接失败");
}
}
}
2)C3P0
使用步骤:
- 添加jar包
- 编写配置文件
- c3p0-config.xml,放在classpath中,或classes目录中
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<default-config>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/mydb1</property>
<property name="user">root</property>
<property name="password">password</property>
<property name="initialPoolSize">10</property>
<property name="maxIdleTime">30</property>
<property name="maxPoolSize">100</property>
<property name="minPoolSize">10</property>
<property name="maxStatements">200</property>
</default-config>
</c3p0-config>
编写工具类
public class C3P0Util{
private static ComboPooledDataSource datasource = new ComboPooledDataSource();
//得到Connection对象
public static Connection getConnection(){
try{
return datasource.getConnection();
}catch(SQLException e){
throw new RuntimeException("创建数据库连接失败");
}
}
}
- 2.4 用JavaWeb服务器管理数据源:Tomcat
开发JavaWeb应用,必须使用一个JavaWeb服务器,JavaWeb服务器都内置数据源
Tomcat:(DBCP)
数据源只需要配置服务器即可
配置数据源的步骤:
- 拷贝数据库连接的jar到tomcatlib目录下
- 配置数据源XML文件
a)如果把配置信息写在tomcat下的conf目录的context.xml中,那么所有应用都能使用此数据源
b)如果是在当前应用的META-INF中创建context.xml, 编写数据源,那么只有当前应用可以使用
<Resource name="jdbc/mydb1" auth="Container" type="javax.sql.DataSource"
maxActive="100" maxIdle="30" maxWait="10000"
username"root" password="password" driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/mydb1"/>
使用连接池
<%
Context ctx = new InitialContext();
DataSource ds = (DataSource)ctx.lookup("java:/comp/env/jdbc/mydb1");
%>
JNDI:java nameing directory interface
JNDI容器就是一个Map
作者:Mr.ml
原文链接:https://blog.csdn.net/MarcoAsensio/article/details/95520220
- 上一篇: 咋回事!现在新人连数据库连接池c3p0都没有听说过?
- 下一篇: 数据库连接池优化 数据库连接池调优
猜你喜欢
- 2024-11-10 测试用例:多线程图片ETL Oracle和S3
- 2024-11-10 连接池之HikariCP:HikariCP框架设计与功能使用分析(第一部分)
- 2024-11-10 深入Spring Boot (十六):从源码分析自动配置原理
- 2024-11-10 网关使用 Apache HttpClient 连接池出现异常
- 2024-11-10 Oracle TAC实战 oracle \t
- 2024-11-10 数据库连接池优化 数据库连接池调优
- 2024-11-10 咋回事!现在新人连数据库连接池c3p0都没有听说过?
- 2024-11-10 Python学习之单例模式 单例模式的代码实现
- 2024-11-10 ADG (Active Data Guard) 数据容灾架构下,如何配置 Druid 连接池?
- 2024-11-10 在项目中使用c3p0作为数据库连接池,被技术总监怼了
你 发表评论:
欢迎- 最近发表
-
- 宇宙厂:深入聊聊 CJS 和 ESM 模块化三点核心差异?
- #前端高手进阶#一起薅羊毛~
- 前端基础进阶(十):深入详解函数的柯里化
- 2025 年 Object 和 Map 如何选择?
- 为何说 postMessage 才是真正的 setTimeout(0)?
- 为什么高手写 JS 总是又快又好?这10个技巧你要知道
- 2025 年 Deno 终于官宣 pnpm 和 Yarn 可使用 JSR?
- 宇宙厂:为什么前端要了解 Interaction to Next Paint (INP)
- Node.js 原生支持 TypeScript?开发者需要了解的一切
- 请务必用 postTask/isInputPending 释放JS主线程!
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端缓存 (63)
- 前端react (48)
- 前端md5加密 (49)
- 前端路由 (55)
- 前端数组 (65)
- 前端定时器 (47)
- 前端接口 (46)
- Oracle RAC (73)
- oracle恢复 (76)
- oracle 删除表 (48)
- oracle 用户名 (74)
- oracle 工具 (55)
- oracle 内存 (50)
- oracle 导出表 (57)
- oracle约束 (46)
- oracle 中文 (51)
- oracle链接 (47)
- oracle的函数 (57)
- mac oracle (47)
- 前端调试 (52)
- 前端登录页面 (48)
本文暂时没有评论,来添加一个吧(●'◡'●)