JSP的模式:
* JSP的设计模式:
* JSP的模式一:JSP + JavaBean设计模式:
* JSP的模式二:JSP + Servlet + JavaBean设计模式:MVC设计模式.
* M:Model
* V:View
* C:Controller
* MVC和EE开发三层结构的关系:
* 反射:(*****)
* 获得类的字节码对象:Class对象.三种获得的方式.
* 类名.class;
* 类的实例.getClass();
* Class.forName();
* 获得构造器:Constructor
* 获得属性:Field
* 获得方法:Method
JDBC的事务管理:
* 事务的概念:指的是逻辑上的一组操作,要么一起成功,要么一起失败.
* 事务的特性:
* 原子性:事务的不可分割
* 一致性:事务执行的前后,数据完整性保持一致.
* 隔离性:一个事务的执行不应该受到另一个事务的干扰
* 持久性:事务一旦结束,将会永久修改到数据库.
* 如果不考虑隔离性:
* 脏读 :一个事务读到另一个未提交的数据.
* 不可重复读 :一个事务读到另一个事务已经提交的update的数据,导致多次的查询结果不一致.
* 虚读 :一个事务读到另一个事务已经提交的insert的数据,导致多次的查询结果不一致.
* 解决读问题:
* 未提交读:以上情况都能发生.
* 已提交读:解决脏读,但是不可重复读和虚读有可能发生
* 重复读:解决脏读和不可重复读,但是虚读有可能发生.
* 串行化:可以解决以上的所有情况.
* JDBC进行事务的管理:
* Connection:
* setAutoCommit(boolean flag);
* commit();
* rollback();
* DBUtils进行的事务的管理:
事务
概念
是指作为单个逻辑工作单元执行的一系列操作,要么完整地执行,要么完全地不执行。
My SQL中操作事务
注意:MySQL中的事务默认是自动提交的
事务相关命令
show variables like '%commit%';
SET autocommit=0;
start transaction;
commit/rollback;
显示事务模式
设置事务模式 0/1 不自动提交/自动提交
开始事务
提交/回滚
操作步骤
* 一种:使用命令的方式.
start transaction;
update account set money = money - 1000 where name = 'zhangsan';
update account set money = money + 1000 where name = 'lisi';
rollback;
* 二种:设置autocommit参数.
set autocommit = 0;
update account set money = money - 1000 where name = 'zhangsan';
update account set money = money + 1000 where name = 'lisi';
rollback;
JDBC中操作事务
相关方法
void setAutoCommit(boolean flag);
void commit();
void rollback();
void rollback(SavePoint sp);
SavePoint setSavePoint();
设置自动提交
提交
回滚
回滚到保存点
设置保存点
事务的特性
1原子性
整个事务中的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
//-----------------------
2一致性
在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。
//-----------------------
3隔离性
隔离状态执行事务,使它们好像是系统在给定时间内执行的唯一操作。如果有两个事务,运行在相同的时间内,执行相同的功能,事务的隔离性将确保每一事务在系统中认为只有该事务在使用系统。这种属性有时称为串行化,为了防止事务操作间的混淆,必须串行化或序列化请求,使得在同一时间仅有一个请求用于同一数据。
//-----------------------
4持久性
在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。
由于一项操作通常会包含许多子操作,而这些子操作可能会因为硬件的损坏或其他因素产生问题,要正确实现ACID并不容易。ACID建议数据库将所有需要更新以及修改的资料一次操作完毕,但实际上并不可行。
目前主要有两种方式实现ACID:第一种是Write ahead logging,也就是日志式的方式。第二种是Shadow paging。
事务并发时的问题
脏读: 一个事务读到了另一个事务未提交的数据.
不可重复读: 一个事务读到了另一个事务已经提交的数据(update),导致两次查询的结果不一致.
幻读(虚读): 一个事务读到了另一个事务已经提交的数据(insert),导致查询的总记录数变化.
隔离级别
read uncommitted :未提交读.脏读、不可重复读、虚读都有可能发生.
read committed:提交读.避免脏读,但是不可重复读和虚读是有可能发生的.
repeatable read :可重复读.避免脏读不可重复读但是虚读有可能发生
serializable:串行的.避免脏读、不可重复读和虚读.
相关命令
MySQL的默认隔离级别为Repeatable read,可以通过下面语句查看:
select @@session.tx_isolation
select @@global.tx_isolation
也可以通过下面语句来设置当前连接的隔离级别:
set global transaction isolation level [4选1]
set session transaction isolation level [4选1]
void setTransactionIsolation(int level);