一、事物
什么是事物/span>
事务,一般是指要做的或所做的事情。在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元。这些单元要么全都成功,要么全都不成功。
做一件事情,这个一件事情中有多个组成单元,这个多个组成单元要不同时成功,要不同时失败。A账户转给B账户钱,将A账户转出钱的操作与B账户转入钱的操作绑定到一个事务中,要不这两个动作同时成功,代表这次转账成功,要不就两个动作同时失败,代表这次转账失败。
事务在开发中的作用
下面来举例说明什么是事务,如下所示:
现实生活中的银行转账业务,张三要给李四转账1000元,而在程序员眼中两条SQL语句就可以搞定,如下:
l 给张三的账户减去1000元;
l 给李四的账户加上1000元;
如果在转账的业务中,成功的将张三的账户减去1000元,而在给李四的账户加1000元的时候,程序出现了问题,李四的账户没有加上1000元,而张三的账户却减掉了1000元,在现实生活中,这种情况肯定是不允许存在的。当我们将这个转账业务放在一个事务中,就不会出现以上情况了。
事务中有多个操作,这些操作要么全部成功,要么全部失败,也就是说给张三的账户减去1000元如果成功了,那么给李四的账户加上1000元的操作也必须是成功的,否则给张三减去1000元,以及给李四加上1000元都必须是失败的
mysql默认事务是自动提交的,一条sql是一个事务
当手动开启事务后,数据库默认的事务的自动提交暂时失效手动开启事务:start transaction
提交事务:commit
提交事务到开启事务之间的所有的sql语句都生效
回滚事务:rollback
从回滚事务到开启事务之间的所有的sql操作都无效
通过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.sqlDataSource
所有的支持javajavax.sql.DataSourcegetConnection() 如果连接对象ConnectionConnectionclose()
常用的开源的连接池技术
DBCP:Apache基金会的开源的连接池技术 Commons项目中子项目
C3P0:开源的连接池技术
Dbcp dbcp DBCP Apache DBCPjar
// 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 C3P0JDBCJNDIJDBC3JDBC2HibernateSpring c3p0dbcp dbcp c3p0 在使用c3p0c3p0jar WEB-INF/lib c3p0-0.9.1.2.jar
c3p0 ComboPooledDataSource ds = new ComboPooledDataSource();
// 2. ds.setDriverClass(“com.mysql.jdbc.Driver”);
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!
// 2. ds.setDriverClass(“com.mysql.jdbc.Driver”);
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!