一、事物

什么是事物?

事务,一般是指要做的或所做的事情。在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元。这些单元要么全都成功,要么全都不成功。

做一件事情,这个一件事情中有多个组成单元,这个多个组成单元要不同时成功,要不同时失败。A账户转给B账户钱,将A账户转出钱的操作与B账户转入钱的操作绑定到一个事务中,要不这两个动作同时成功,代表这次转账成功,要不就两个动作同时失败,代表这次转账失败。

事务在开发中的作用

下面来举例说明什么是事务,如下所示:

现实生活中的银行转账业务,张三要给李四转账1000元,而在程序员眼中两条SQL语句就可以搞定,如下:

l 给张三的账户减去1000元;

l 给李四的账户加上1000元;

如果在转账的业务中,成功的将张三的账户减去1000元,而在给李四的账户加1000元的时候,程序出现了问题,李四的账户没有加上1000元,而张三的账户却减掉了1000元,在现实生活中,这种情况肯定是不允许存在的。当我们将这个转账业务放在一个事务中,就不会出现以上情况了。

事务中有多个操作,这些操作要么全部成功,要么全部失败,也就是说给张三的账户减去1000元如果成功了,那么给李四的账户加上1000元的操作也必须是成功的,否则给张三减去1000元,以及给李四加上1000元都必须是失败的

mysql的事务控制

mysql默认事务是自动提交的,一条sql是一个事务

当手动开启事务后,数据库默认的事务的自动提交暂时失效手动开启事务:start transaction

提交事务:commit

提交事务到开启事务之间的所有的sql语句都生效

回滚事务:rollback

从回滚事务到开启事务之间的所有的sql操作都无效

jdbc的API的事务控制

通过Connection对象可以控制事务

jdbc中想控制事务其实是控制jdbc的更新数据库的API方法---executeUpdate

开启事务:connection.setAutoCommit(false);

提交事务:connection.commit();

回滚事务:connection.rollback();

官方的介绍事务特性

事务的四大特性简称ACID(Atomicity Consistency Isolation Durability),分别是:

l 原子性:原子性对应的英文是Atomicity,即表示事务中所有操作是不可再分割的原子单位。事务中所有操作要么全部执行成功,要么全部执行失败;

l 一致性:一致性对应的英文是Consistency,事务执行后,数据库状态与其它业务规则保持一致。例如转账业务,无论事务执行成功与否,参与转账的两个账号余额之和应该是不变的;

l 隔离性:隔离性对应的英文是Isolation,是指在并发操作中,不同事务之间应该隔离开来,使每个并发中的事务不会相互干扰;

l 持久性:持久性对应的英文是Durability,指的是一旦事务提交成功,事务中所有的数据操作都必须被持久化到数据库中,即使提交事务后,数据库马上崩溃,在数据库重启时,也必须能保证通过某种机制恢复数据。

不同的事务,其一致性的表现形式是不同的,事务的其他三大特性其实都是为了事务的一致性服务的。

事务的四大特性概括

原子性:数据库的操作的最小的单位就是事务

一致性:一个事务中的多个操作的结果数据是一致的,同时成功和同时失败

隔离性:多个事务之间的操作互不影响

持久性:当一个事务提交后,更新操作才持久化到磁盘上

事务的隔离级别与问题

不考虑隔离性产生的问题介绍

n 脏读 一个事务读取到了另一个事务未提交数据.

n 不可重复读 一个事务内,两次读取到的数据不一致.(update)

n 虚读(幻读) 两次读取的数据不一致(insert)

事务的四种隔离级别介绍

数据库内部定义了四种隔离级别,用于解决三种隔离问题

u 1 Serializable:可避免脏读、不可重复读、虚读情况的发生。(串行化)

u 2 Repeatable read:可避免脏读、不可重复读情况的发生。(可重复读)不可以避免虚读

u 3 Read committed:可避免脏读情况发生(读已提交)

u 4 Read uncommitted:最低级别,以上情况均无法保证。(读未提交)

mysql数据库默认的事务隔离级别-----repeatable read级别.

oracle数据默认的事务隔离级别 ----read committed

设置事务隔离级别

n mysql中设置

数据库默认有事务的隔离级别,mysql 中查看与修改事务的隔离级别

u set session transaction isolation level 设置事务隔离级别

u select @@tx_isolation 查询当前事务隔离级别

n jdbc中设置事务隔离级别

在java.sql.Connection接口中提供

u setTransactionIsolation(int level) ;

参数可以取 Connection 常量之一:

Connection.TRANSACTION_READ_UNCOMMITTED、

Connection.TRANSACTION_READ_COMMITTED、

Connection.TRANSACTION_REPEATABLE_READ

Connection.TRANSACTION_SERIALIZABLE。

(注意,不能使用 Connection.TRANSACTION_NONE,因为它指定了不受支持的事务。)

注意:事务控制必须在service层

二、连接池

什么是连接池

数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出。对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标。数据库连接池正是针对这个问题提出来的。数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。这项技术能明显提高对数据库操作的性能。

以下是使用连接池与没有使用连接池的一个比较图例

连接池的优点

节省创建连接与释放连接 性能消耗

连接池中连接起到复用的作用 ,提供程序性能

连接池的原理

连接池基本的思想是在系统初始化的时候,将数据库连接作为对象存储在内存中,当用户需要访问数据库时,并非建立一个新的连接,而是从连接池中取出一个已建立的空闲连接对象。使用完毕后,用户也并非将连接关闭,而是将连接放回连接池中,以供下一个请求访问使用。而连接的建立、断开都由连接池自身来管理。同时,还可以通过设置连接池的参数来控制连接池中的初始连接数、连接的上下限数以及每个连接的最大使用次数、最大空闲时间等等。也可以通过其自身的管理机制来监视数据库连接的数量、使用情况等。

连接池规定

javax.sql包下有一个 DataSource

所有的支持java的连接池都应该实现javax.sql.DataSource接口,在这个接口中提供了一个方法  getConnection()它就是获取一个连接对象的。

如果连接对象Connection是通过连接池获取的,当通过Connection对象调用close()方法时,不在是销毁连接对象,而是将连接对象放回到连接池。

常用的开源的连接池技术

DBCP:Apache基金会的开源的连接池技术 Commons项目中子项目

C3P0:开源的连接池技术

Dbcp连接池

dbcp连接池介绍

DBCP 是 Apache 软件基金组织下的开源连接池实现,使用DBCP数据源,应用程序应在系统中增加如下两个 jar 文件:

  • Commons-dbcp.jar:连接池的实现
  • Commons-pool.jar:连接池实现的依赖库

Tomcat 的连接池正是采用该连接池来实现的。该数据库连接池既可以与应用服务器整合使用,也可由应用程序独立使用。DBCP 是 Apache 软件基金组织下的开源连接池实现,使用DBCP数据源,应用程序应在系统中增加如下两个 jar 文件:

Commons-dbcp.jar:连接池的实现

Commons-pool.jar:连接池实现的依赖库

Tomcat 的连接池正是采用该连接池来实现的。该数据库连接池既可以与应用服务器整合使用,也可由应用程序独立使用。

dbcp连接池编码配置

// 1.创建连接池对象

BasicDataSource ds = new BasicDataSource();

// 2.设置相关属性

ds.setDriverClassName("com.mysql.jdbc.Driver");

ds.setUrl("jdbc:mysql:///day13");

ds.setUsername("root");

ds.setPassword("abc");

dbcp连接池使用配置文件

//1.加载配置信息

Properties props = new Properties();

props.load(new FileInputStream(properties配置文件路径);

properties文件内容

driverClassName=com.mysql.jdbc.Driver

url=jdbc:mysql:///day13

username=root

password=abc

// 2.通过BasicDataSourceFactory获取一个连接池对象

DataSource ds = BasicDataSourceFactory.createDataSource(props);

C3p0连接池

c3p0连接池介绍

C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate,Spring等。

c3p0与dbcp区别

dbcp没有自动回收空闲连接的功能

c3p0有自动回收空闲连接功能

在使用c3p0连接池时将c3p0的jar 复制WEB-INF/lib下,我们使用的版本

c3p0-0.9.1.2.jar

c3p0连接池编码配置

ComboPooledDataSource ds = new ComboPooledDataSource();

// 2.手动配置参数

ds.setDriverClass("com.mysql.jdbc.Driver");

ds.setJdbcUrl("jdbc:mysql:///day13");

ds.setUser("root");

ds.setPassword("abc");

c3p0连接池使用配置文件

只要在src下创建c3p0.properties or c3p0-config.xml名称的配置文件,c3p0会自动查找.

ComboPooledDataSource ds = new ComboPooledDataSource();

自动查找配置文件

在src/c3p0-config.xml

<c3p0-config>

<default-config>

<property name="driverClass">com.mysql.jdbc.Driver</property>

<property name="jdbcUrl">jdbc:mysql:///day17</property>

<property name="user">root</property>

<property name="password">abc</property>

</default-config>

</c3p0-config>

JAVA中事物以及连接池的更多相关文章

  1. Java中使用C3P0连接池

    先看官网给的范例: import java.sql.*; import javax.naming.*; import javax.sql.DataSource; import com.mchange. ...

  2. JNDI和在tomcat中配置DBCP连接池 元数据的使用 DBUtils框架的使用 多表操作

    1 JNDI和在tomcat中配置DBCP连接池 JNDI(Java Naming and Directory Interface),Java命名和目录接口,它对应于J2SE中的javax.namin ...

  3. java操作mongodb(连接池)(转)

    原文链接: java操作mongodb(连接池) Mongo的实例其实就是一个数据库连接池,这个连接池里默认有10个链接.我们没有必要重新实现这个链接池,但是我们可以更改这个连接池的配置.因为Mong ...

  4. Java操作数据库——使用连接池连接数据库

    Java操作数据库——使用连接池连接数据库 摘要:本文主要学习了如何使用JDBC连接池连接数据库. 传统方式和连接池方式 传统方式的步骤 使用传统方式在Java中使用JDBC连接数据库,完成一次数据库 ...

  5. Java自己动手写连接池四

    Java自己动手写连接池四 测试: package com.kama.cn; import java.sql.Connection; public class Test { public static ...

  6. Java自己动手写连接池三

    Java自己动手写连接池三,核心代码; package com.kama.cn; import java.sql.Connection;import java.util.ArrayList;impor ...

  7. 转载:Java中的字符串常量池详细介绍

    引用自:http://blog.csdn.net/langhong8/article/details/50938041 这篇文章主要介绍了Java中的字符串常量池详细介绍,JVM为了减少字符串对象的重 ...

  8. python中实现mysql连接池

    python中实现mysql连接池 import pymysql from DBUtils.PooledDB import PooledDB MYSQL_HOST = 'localhost' USER ...

  9. Java中的字符串常量池,栈和堆的概念

    问题:String str = new String(“abc”),“abc”在内存中是怎么分配的?    答案是:堆内存.(Tips:jdk1.8 已经将字符串常量池放在堆内存区) 题目考查的为Ja ...

随机推荐

  1. Servlet小总结(转)

    一,什么是Servlet? Servlet是一个Java编写的程序,此程序是基于Http协议的,在服务器端运行的(如tomcat), 是按照Servlet规范编写的一个Java类. 二,Servlet ...

  2. API测试自动化——基于CDIF的SOA基本功能(实例篇)

    今天我们通过一些实例来体验一下API的自动化测试,感受一下基于CDIF的SOA的一些基本功能. 传统的测试工具在测试一个API的时候,必须手动填写这个API所需要接收的所有信息,比如一个查询航班动态的 ...

  3. String 类的实现(2)深度拷贝详解

    我们已经知道了浅拷贝存在的问题,即多次析构同一空间.这个问题是类的成员函数引起的,就是前面浅拷贝里相当于编译器自动合成的函数,确切的说,浅拷贝里的问题是由隐士拷贝构造函数和隐士赋值运算符引起的. 拷贝 ...

  4. Spring整合Struts2,Hibernate的xml方式

    作为一个学习中的码农,一直学习才是我们的常态,所以最近学习了SSH(Spring,Struts2,Hibernate)整合,数据库用的MySQL. 写了一个简单的例子,用的工具是IntelliJ Id ...

  5. JavaWeb之cookie

    什么叫做会话 ? 用户从打开一个浏览器开始,浏览器网站,到关闭浏览器的整个过程叫做一次会话! 每个用户与服务器进行交互的过程中,各自会有一些数据,程序要想办法保存每个用户的数据. 例如:用户点击超链接 ...

  6. Android kernel LOGO的更换方法

    [从制作logo到LCD显示或者VGA显示logo] 1.制作logo的方法: 首先选择一个自己喜欢的图片,然后通过GIMP软件将该图片保存为.png格式, 变换方式这个就不说了(very easy) ...

  7. 使用FSharp 探索Dotnet图像处理功能1--反色变化

    坚持写博客是最近的目标.加油. 业余学习fsharp以来一直觉得这才是Dotnet开发,或者说所有开发者应该拥有的语言.配合Visual Studio的代码提示,即时执行窗口.开发程序有着极大的乐趣. ...

  8. 关于ARM内核与架构的解释

    本文摘自某论坛某位大神的一段回复,经典至极,copy来己用! 只要你玩过ARM内核的芯片,那么关于内核和架构,我想应该或多或少的困惑过你,看了下面的介绍,你应该会清楚很多! 好比你盖房子,刚开始因为水 ...

  9. MarkDown 常用语法教程

    MarkDown 语法说明 [TOC] 标题 标题1 ====== 标题2 ----- ## 大标题 ### 小标题 #### 小标题 列表 无序列表 + 列表文本前使用 [减号+空格] * 列表文本 ...

  10. Xamarin.Forms+Prism(1)—— 开发准备

    本次随笔连载,主要用于记录本人在项目中,用Xamarin.Forms开发APP中所使用的第三方技术或一些技巧. 准备: 1.VS2017(推荐)或VS2015: 2.JDK 1.8以上: 3.Xama ...