我的学习之路_第二十二章_事务
JDBC事务
【事务】
作用: 保证多条SQL语句,要么都执行成功,要么都执行失败.
mysql数据库,执行SQL语句,自动开启事务,提交事务,回滚事务,把数据永久保存
oracle数据库,执行SQL语句,手动开始会务,提交事务,回滚事务,把数据永久保存.
Connection接口中和事务有关的方法:
无返回值 setAutoCommit(boolean autoCommit) 将此连接的自动提交模式设置为给定状态.
参数:autoCommit : true表示自动提交模式, false表示禁用自动提交模式
要把autoCommit设置为false,让事务手动开启
无返回值 commit() 如果多条SQL语句都执行成功,提交事务
无返回值 rollback() 有一条SQL语句执行失败,就回滚事务,把数据回滚到开启事务之前的状态.
【DBUtils工具类】
QueryRunner(DataSource ds)
QueryRunner会自动从连接池获取连接,使用完毕归还连接,自动管理事务
QueryRunner() 空参数构造方法,可以手动控制事务
调用update和query方法时需要手动传递连接对象
连接对象Connection可以使用C3P0工具类获取
【分层管理】
dao层(data access object) : 数据访问层
Service : 业务层
Wed 层: 给用户看的
★分层的目的 : 解耦 可维护性 可扩展性 可重用性
▲不同的层次,使用不同的包表示:
com.itcast 一般为公司域名倒写
com.itcast.dao dao层
com.itcast.service service层
com.itcast.domain javabean层(实体层)
com.itcast.utils 工具层
com.itcast.wed wed层
java.lang.ThreadLocal<T>
该类提供了线程局部变量,用于当前线程中共享数据.ThreadLocal工具类底层就是一个Map集合,
key存放的当前线程,value存放需要共享的数据.
没有返回值 set(T value) 将此线程局部变量的当前线程副本中的值,设置为指定值
T value: T就是创建对象时,指定的数据类型value就是共享的数据.
返回值 : T get() 返回次线程局部变量的当前线程副本的值.
连接管理类抽取(ConnectionManager类)
1,获取连接的功能
需要把获取的连接对象放入ThreadLocal
保证一个线程存储完Connection之后,不管获取多少此Connection都是同一个connection
2,开启事务功能
3.提交事务功能
4.回滚事务的功能
5.关闭连接功能
【总结】
● 事务的特性:
1.原子性:强调事务的不可分割,多条语句要么都成功,要么都失败.
2.一致性:强调的是事务的执行的前后,数据要保持一致.
3.隔离性:一个事务的执行不应该受到其他事务的干扰.
4.持久性:事务一旦结束(提交/回滚)数据就持久保持到了数据库.
如果不考虑事务的隔离性,引发一些安全性问题:
▲脏读: 一个事务读到另一个事务还没有提交的数据
脏读又称无效数据的读出,是指在数据库访问中,事务T1将某一值修改,然后事务T2读取该值,此后T1因为某种
原因撤离对该值的修改,这就导致了T2所读到的数据是无效的.
▲不可重复读:一个事物读到另一个事务已经提交的update的数据,导致在当前的事务总多次查询结果不一致.
▲虚度/幻读 : 一个事务读到另一个事务已经提交的insert的数据,导致在当前的事务中多次的查询结果不一致.
【事务的隔离级别】
★ 1 read uncommitted :未提交读.脏读, 不可重复读,虚读都可能发生.
★ 2 read committed :已提交读.避免脏读.但是不可重复读和虚读有可能发生.(oracle默认)
★ 4 repeatable read :可重复读.避免脏读,不可重复读.但是虚读有可能发生.(Mysql默认)
★ 8 serializable : 串行话的.避免脏读,不可重复读,虚读的发生.
级别越高,越安全,效率越低.
mysql中:
查看当前的事物隔离级别: SELECT@@TX_ISOLATION
更改当前的事物隔离级别: SET TRANSACTION ISOLATION LEVEL 四个级别之一.
设置隔离级别必须在事物之前.
Connection对象中设置级别的方法:
没有返回值 setTransactionIsolation(int level) 试图将此connection对象的事物隔离级别更改为给定的级别.