我的学习之路_第二十二章_事务

Posted 贾_jia

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我的学习之路_第二十二章_事务相关的知识,希望对你有一定的参考价值。

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中:

查看当前的事物隔离级别: [email protected]@TX_ISOLATION

更改当前的事物隔离级别: SET TRANSACTION ISOLATION LEVEL 四个级别之一.

设置隔离级别必须在事物之前.


Connection对象中设置级别的方法:

没有返回值 setTransactionIsolation(int level) 试图将此connection对象的事物隔离级别更改为给定的级别.

以上是关于我的学习之路_第二十二章_事务的主要内容,如果未能解决你的问题,请参考以下文章

python学习第二十二章

我的学习之路_第二章_接口/多态

我的学习之路_第二十六章_javaScript

我的学习之路_第二十七章_jQuery

我的学习之路_第二十一章_JDBC连接池

我的学习之路_第二十八章_JQuery 和validator插件