一、事务
1.事务概念:事务是指逻辑上的一组操作,要么同时完成,要么同时不完成。
1).数据库默认会帮我们管理事务,但是默认条件下一条语句就是一个事务
2).通过命令手动的可控制事务
start transaction;-- 开启一个事务,这条语句之后在commit和rollback之前的语句都是一个事务
开启事务之后执行多条语句并没有对真正的对数据库产生影响
commit;--提交事务,使事务真正对数据库产生作用
rollback--回滚事务,取消事务产生的影响
2.通过JDBC管理事务
connection.setAutoCommit(false);--相当于start transaction
connection.commit;
connection.rollback;
SavePoint sp = conn.setSavePoint();--设置回滚点
conn.rollback(sp);--设置回滚到回滚点
3.事务的四大特性(ACID)
原子性:指事务是一个不可分割的工作单位
一致性:事务前后数据的完整性必须保持一致。
隔离性:并发访问数据库时,一个用户的事务不能被其他用户的事务所干扰,并发事务之间的数据要相互隔离
持久性:一个事务一旦被提交,它对数据库中数据的改变是持久的,接下来即使数据库发生故障也不应该对其有
任何影响
4.隔离性:使用锁机制可以解决数据库的隔离性问题,但是使用锁机制之后,数据库的性能会大大的降低,在高并发的情
况下,线程的等待时间太长
1).多线程查询时,没有任何多线程安全问题
2).多线程修改时,必然有多线程安全问题,使用锁机制进行控制。只要有一个事务进行了修改,其他事务只能等待
3).多线程查询修改时:
一个事务读取到另一个事务未提交的数据:脏读
一个事务读取到另一个事务已提交的数据:不可重复读
一个事物读取到另一个事务已经插入的数据:虚读(幻读)
4).单线程数据库:可以解决所有问题,但是效率低下
5).四个隔离级别:
read uncommitted;不能防止脏读、不可重复读、虚读
read committed;(oracle默认的隔离级别)数据库可以防止脏读、不能防止不可重复读和虚读
Repeatable read;(mysql默认的隔离级别)数据库可以防止脏读、不可重复读,不能防止虚读
Serializable:串行化的数据库(单线程数据库),能防止所有问题
6).注:
select @@tx_isolation;--查看当前数据库的隔离级别
set (session 修改当前客户端的隔离级别|global修改数据库默认的隔离级别,新开的客户端将默认
使用这个隔离级别)transaction isolation level xxxx;--设置数据库的隔离级别
性能上:read uncommitted>read committed>repeatable read>serializable
安全性:serializable>repeatable read>read committed>read uncommitted
6).共享锁和排它锁
共享锁:共享锁和共享锁可以共存,共享锁和排它锁不能共存,只有在serializable隔离级别下进行
查询才加共享锁
排它锁:排它锁和所有锁都不能共存,所有隔离级别下,进行增删改都会加排它锁
5.更新丢失问题
1).多个事务基于同样一个查询结果进行修改,后提交的事务会覆盖先提交的事务,就发生了更新丢失问题
2).serializable隔离级别本身就能防止更新丢失问题,但是数据库一旦设置为serializable隔离级别性能就会十分
低下,所以通常不会设置此隔离级别
3).乐观锁和悲观锁:都不是数据库中真实存在的锁,只是两种解决方案的名字而已,体现了人们在看待更新丢失问
题时的不同态度
悲观锁:在进行查询的过程中手动的加上排他锁,就可以防止更新丢失问题;如果修改比较多而查询比较少
使用悲观锁
select * from tbl_name for update;for update就可以在查询时手动加上排它锁
乐观锁:查询时不加锁,但是在数据库表中增加一个版本字段,每次在进行修改时都是基于查询时的版本来
进行,这样就可以防止更新丢失问题;如果查询比较多而修改比较少使用乐观锁
二、连接池
1.自定义数据源的方式:
继承
装饰设计模式
动态代理设计模式
2.DBCP数据库创建数据源
BasicDataSource
BasicDataSourceFactory
3.C3P0配置数据源
ComboPooledDataSource
c3p0-config.xml
4.tomcat内置数据源(dbcp数据源)
1.事务概念:事务是指逻辑上的一组操作,要么同时完成,要么同时不完成。
1).数据库默认会帮我们管理事务,但是默认条件下一条语句就是一个事务
2).通过命令手动的可控制事务
start transaction;-- 开启一个事务,这条语句之后在commit和rollback之前的语句都是一个事务
开启事务之后执行多条语句并没有对真正的对数据库产生影响
commit;--提交事务,使事务真正对数据库产生作用
rollback--回滚事务,取消事务产生的影响
2.通过JDBC管理事务
connection.setAutoCommit(false);--相当于start transaction
connection.commit;
connection.rollback;
SavePoint sp = conn.setSavePoint();--设置回滚点
conn.rollback(sp);--设置回滚到回滚点
3.事务的四大特性(ACID)
原子性:指事务是一个不可分割的工作单位
一致性:事务前后数据的完整性必须保持一致。
隔离性:并发访问数据库时,一个用户的事务不能被其他用户的事务所干扰,并发事务之间的数据要相互隔离
持久性:一个事务一旦被提交,它对数据库中数据的改变是持久的,接下来即使数据库发生故障也不应该对其有
任何影响
4.隔离性:使用锁机制可以解决数据库的隔离性问题,但是使用锁机制之后,数据库的性能会大大的降低,在高并发的情
况下,线程的等待时间太长
1).多线程查询时,没有任何多线程安全问题
2).多线程修改时,必然有多线程安全问题,使用锁机制进行控制。只要有一个事务进行了修改,其他事务只能等待
3).多线程查询修改时:
一个事务读取到另一个事务未提交的数据:脏读
一个事务读取到另一个事务已提交的数据:不可重复读
一个事物读取到另一个事务已经插入的数据:虚读(幻读)
4).单线程数据库:可以解决所有问题,但是效率低下
5).四个隔离级别:
read uncommitted;不能防止脏读、不可重复读、虚读
read committed;(oracle默认的隔离级别)数据库可以防止脏读、不能防止不可重复读和虚读
Repeatable read;(mysql默认的隔离级别)数据库可以防止脏读、不可重复读,不能防止虚读
Serializable:串行化的数据库(单线程数据库),能防止所有问题
6).注:
select @@tx_isolation;--查看当前数据库的隔离级别
set (session 修改当前客户端的隔离级别|global修改数据库默认的隔离级别,新开的客户端将默认
使用这个隔离级别)transaction isolation level xxxx;--设置数据库的隔离级别
性能上:read uncommitted>read committed>repeatable read>serializable
安全性:serializable>repeatable read>read committed>read uncommitted
6).共享锁和排它锁
共享锁:共享锁和共享锁可以共存,共享锁和排它锁不能共存,只有在serializable隔离级别下进行
查询才加共享锁
排它锁:排它锁和所有锁都不能共存,所有隔离级别下,进行增删改都会加排它锁
5.更新丢失问题
1).多个事务基于同样一个查询结果进行修改,后提交的事务会覆盖先提交的事务,就发生了更新丢失问题
2).serializable隔离级别本身就能防止更新丢失问题,但是数据库一旦设置为serializable隔离级别性能就会十分
低下,所以通常不会设置此隔离级别
3).乐观锁和悲观锁:都不是数据库中真实存在的锁,只是两种解决方案的名字而已,体现了人们在看待更新丢失问
题时的不同态度
悲观锁:在进行查询的过程中手动的加上排他锁,就可以防止更新丢失问题;如果修改比较多而查询比较少
使用悲观锁
select * from tbl_name for update;for update就可以在查询时手动加上排它锁
乐观锁:查询时不加锁,但是在数据库表中增加一个版本字段,每次在进行修改时都是基于查询时的版本来
进行,这样就可以防止更新丢失问题;如果查询比较多而修改比较少使用乐观锁
二、连接池
1.自定义数据源的方式:
继承
装饰设计模式
动态代理设计模式
2.DBCP数据库创建数据源
BasicDataSource
BasicDataSourceFactory
3.C3P0配置数据源
ComboPooledDataSource
c3p0-config.xml
4.tomcat内置数据源(dbcp数据源)