java高级工程师---------spring的知识重点
spring的作用
1)spring主要包括IOC和AOP,IOC依赖注入(控制反转)很好的解决了代码的硬编码耦合问题,通过配置文件注入对象的方式实例化,扩展性更强。
2)AOP面向切面编程的思想在一个业务流程中通过动态代理动态的将操作织入到流程中,减轻了编码程度,可配置性和扩展性高,提高代码重复可用度。
spring的事物隔离级别
在Spring中定义了5中不同的事务隔离级别:
1. ISOLATION_DEFAULT(一般情况下使用这种配置既可) ;
这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别。
2. ISOLATION_READ_UNCOMMITTED 4 p" L. I' F; k1 {) a. D( E5 ?: V
这是事务最低的隔离级别,它充许别外一个事务可以看到这个事务未提交的数据。这种隔离级别会产生脏读,不可重复读和幻像读。
大部分数据库缺省的事物隔离级别都不会出现这种状况) 1 N$ G7 X" U# U6 S/ u' z/ I
3. ISOLATION_READ_COMMITTED
保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据。这种事务隔离级别可以避免脏读出现,但是可能会出现不可重复读和幻像读。 : U8 m# n8 g1 k( E: N
什么是脏读?(修改且未提交引起)
例如:
张三的工资为5000,事务A中把他的工资改为8000,但事务A尚未提交。与此同时,事务B正在读取张三的工资,读取到张三的工资为8000。随后,事务A发生异常,而回滚了事务。张三的工资又回滚为5000。最后,事务B读取到的张三工资为8000的数据即为脏数据,事务B做了一次脏读。' T, B j d! H# i) s$ i
(大部分数据库缺省的事物隔离级别都不会出现这种状况) ; N$ ~" J7 a& Y* ?/ G8 I
4. ISOLATION_REPEATABLE_READ
这种事务隔离级别可以防止脏读,不可重复读。但是可能出现幻像读。 3 [* {- F2 s. w+ |
什么是不可重复读?(修改引起) 6 h2 E% J, S7 f9 n+ m0 U4 ]" ?% e. a
例如: / ^7 Y# T6 |& Z' B
在事务A中,读取到张三的工资为5000,操作没有完成,事务还没提交。 5 K: N6 c" [$ p: J4 L/ I" B
与此同时,事务B把张三的工资改为8000,并提交了事务。随后,在事务A中,再次读取张三的工资,此时工资变为8000。在一个事务中前后两次读取的结果并不致,导致了不可重复读。
(大部分数据库缺省的事物隔离级别都不会出现这种状况) . h+ U! y9 {) }1 R8 ~% B, l; t
5. ISOLATION_SERIALIZABLE
这是花费最高代价但是最可靠的事务隔离级别。事务被处理为顺序执行。除了防止脏读,不可重复读外,还避免了幻读。 % c0 @8 E& g" x1 X/ p3 F; H1 q
什么是幻读?(添加新记录引起) 9 d! D% j. |9 w9 N+ ~
例如:
A目前工资为5000的员工有10人,事务A读取所有工资为5000的人数为10人。此时,事务B插入一条工资也为5000的记录。这是,事务A再次读取工资为5000的员工,记录为11人。此时产生了幻读。
大部分数据库缺省的事物隔离级别都会出现这种状况,此种事物隔离级别将带来表级锁)
_! O3 W6 M/ L
说明 :Oracle数据库缺省的事物隔离级别已经保证了避免脏读和不可重复读。但可能会幻读,避免幻读需要加表级锁,Oracle缺省行级锁。在基于Spring的事物配置中一定要慎重使用ISOLATION_SERIALIZABLE的事物隔离级别。这种配置会使用表级锁,对性能影响巨大。一般没有特殊需要的话,配置为使用数据库缺省的事物隔离级别便可。
事物的传播特性
1、Required t1无事物则t2开启新事物,t1有事物则t2也用t1事物
2、RequiredNew t1无事物则t2开启新事物,t1有事物t2仍然开启t2事物
3、Supports t1无事物则t2也不开启事物,t1开启事物则t2使用t1事物
4、Mandatory t1无事物t2则报错,t1有事物则t2也用t1事物
5、NotSupport t1无事物则t2也无事物,t1有事物t2也无事物
6、Never t1无事物则t2也无事物,t1有事物则t2也报错
Bean的作用域
<bean scope=”singleton”> </bean>
Singleton - 当ApplicationContext初始化时,容器会自动初始化所有singleton
每次程序向Spring容器请求是,Spring容器总是返回最开始创建的对象
Prototype – 每次程序向Spring容器请求是,Spring容器会临时去创建prototype bean
Request--- 要在web应用才有效,每个用户请求
Session --- 要在web应该有才有效,每个用户会话
Global session 仅在portlet context才有效
spring的事务如何配置
spring的声明式事务配置:
1. <!-- 配置sessionFactory -->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="configLocation">
<value>/WEB-INF/classes/hibernate.cfg.xml</value>
</property>
</bean>
2. 配置事务管理器
<!-- 配置事务管理器 -->
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>
</bean>
3. 配置事务特性
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="add*" propagation="REQUIRED"/>
<tx:method name="update*" propagation="REQUIRED"/>
<tx:method name="del*" propagation="REQUIRED"/>
<tx:method name="*" read-only="true"/>
</tx:attributes>
</tx:advice>
补充:软件开发 , Java ,