黑马程序员技术交流社区
标题:
【石家庄校区】MVC和事务
[打印本页]
作者:
巴拉巴拉x
时间:
2018-5-27 16:20
标题:
【石家庄校区】MVC和事务
本帖最后由 小石姐姐 于 2018-5-30 15:11 编辑
MVC和事务
MVC
反射
一个JavaBean有且只有一个对应的Class对象(字节码对象),不管是以哪种方式获得的,都是同一个!!
目的
操作某个类的属性或方法
用.class文件获取对象:newInstance();且获取的对象是Object类型的.
用.class文件获取成员变量,构造方法,成员方法等,都是用get,
获取构造方法
字节码对象.getConstructor(参数1.class,参数2.class.......)
获取成员方法
getMethod(String name,参数1数据类型.class,参数2数据类型.class...).
执行成员方法
.invoke()-->导入的是java.lang.reflect...invoke
内省
基于反射,但是只能获取get/set方法
介绍
内省:特定的JavaBean
javaBeans类
BeanInfo bi = 字节码对象.getBeanInfo()
一个JavaBean的属性是有get/set方法来确定的(其实只是为了安全,获取了公共的get/set方法,然后给属性赋值和获取值,如果没有对应的方法则不能操作,但是真正的属性还是成员变量那,可以设置Accessible的值为true,然后就可以操作没有get/set方法的属性)
写工具类
动态代理和反射结合使用,通用性更高.
事务
Connection对象的方法
开启事务
JDBC设置自动提交为false
setAutoCommit(false);
Mysql 事务管理有两种方式:
手动开启事务
start transaction
多条sql语句
commit/rollback
设置一个自动提交的参数为off(Mysql数据库事务默认是自动提交的,而Oracle 数据库事务默认是不自动提交的.)
show variables like '%commit%':查看是否是自动提交事务.
set autocommit = 0;
0和off同等
1和on 同等
如果事务语句比较多,就用下边这个方式,设置自动提交为关闭状态,写完一组逻辑单元就提交一次,然后再继续写下一组逻辑单元,如果事务语句很少,就用上边的方法,只要提交或者回滚,自动提交就又会开启,
事务管理的核心思想
保证Dao的Connection对象是同一个,
DBUtils是采用的向下传递的方式,保证是同一Connection对象
有一个框架是采用的绑定本地线程的方法,即把一个连接绑定到当前线程上(通过ThreadLocal类),谁用谁去里边取,
ThreadLocal类,
一个Servlet就是一个线程,可以把一个连接绑定到一个线程上
类中有个方法:
set()-->绑定
get()-->获取
小总结
事务
逻辑上的一组操作,是&的关系,只要有一个失败就全部失败
事务的特性:ACID
原子性
事务的不可分割
一致性
事务执行前后,数据的完整性要保持一致
隔离性
一个事务的执行,不应该受到其他事务的干扰
持久性
事务一旦结束(提交或者回滚),数据就持久保持到了数据库.
如果不考虑事务的隔离性,就会引发一些安全性的问题,
一类是读的问题
脏读
读到了未提交的数据(即读到了还没有持久性保存的数据)
不可重复读
一个事务读到了另一个事务已经提交的update的数据,导致在当前的事务中
多次查询结果不一致
虚读/幻读
一个事务读到了另一个事务
已经提交的insert的数据
,导致在当前的事务中多次查询的结果不一致
一类是写的问题
引发两类丢失更新.
如何解决那三种读的问题
设置事务的隔离级别
read uncommitted:未提交读,->脏读,不可重复读,幻读都有可能发生.
read committed:已提交读--->避免脏读,但是不可重复读和幻读有可能发生
repeatable read:可重复读-->可以避免脏读,不可重复读,有可能发生幻读
serializable:串行化:三种问题都可以避免
Connection类中有方法设置隔离级别
setTransactionIsolation(int level)
int level可以用字段来代替
就是隔离级别的全部大写,单词之间用_分开
conn.setTransactionIsolation(TRANSACTION_READ_UNCOMMITTED)
conn.setTransactionIsoation(TRANSACTION_READ_COMMITTED)
conn.setTransactionIsolation(TRANSACTION_REPEATABLE_READ)
conn.setTransactionIsolation(TRANSACTION_SERIALIZABLE)
设置的隔离级别都是当前事务的隔离级别,不影响其他事务的级别.
在DOS窗口设置隔离级别的命令
set session transaction isolation level serializable:设置事务隔离级别为最高级别-->serializable
select @@tx_isolation:查看当前事务的隔离级别.
start transaction:开启事务
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2