文章目录
spring为什么要与持久层技术整合
1、需要访问数据库。
2、jdbc、mybatis等存在代码冗余,对其进行整合。
jdbc——jdbcTemplate
Hibernate——HibernateTemplate
MyBatis——SqlSessionFactroyBean、MapperScannerConfigure
与mybatis整合
1.配置数据库连接池(数据源)
datasourse中包含connect
2、配置sqlSessionFectoryBean
1)数据源
2)别名
3)mapper.xml文件位置
3、配置MapperScannerConfigure
1)数据源
2)Mapper接口位置
spring在整合mybatis时,事务自动提交
spring整合mybatis时,引入了外部连接池对象,连接池事务自动提交,整合后保持自动的提交这个机制(Connect.setAutoCommit(ture)),不需要手工进行事务的操作,也能进行事务的提交。
执行多条sql需要事务控制解决这个问题。
事务
ACID
原子性、一致性、隔离性、持久性
如何控制事务
1)JDBC
Connection.setAutoCommit(false);
Connection.commit();
Connection.rollback();
2)Mybatis
自动开启事务
sqlSession(Connection).commit();
sqlSession(Connection).rollback();
最终:控制事务的底层都是Connection对象完成的。
spring 控制事务
Spring通过AOP方式进行事务开发。
基于注解
1)额外功能
<bean id="dataSorseTransactionManager" class="org.springframswork.jdbc.datasourse.DataSourseTransactionManager">
2)切入点
@Transactional
3)切面
组装切入点,切面
<tx:annotation-driver transction-manager="dataSourceTransactionManeger"/>
<!-- 切换成cglib-->
<tx:annotation-driver transction-manager="dataSourceTransactionManeger" procy-target-class="true"/>
基于标签进行事务配置(代替@Transational和tx:annotation-driver)
<tx:advice id="txAdvice" transacation-manager="dataSourceTransactionManeger">
<tx:attributes>
<tx:method name="*" progagation="supports" read-only="true"></tx:method>
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="pc" expression="excution(* *(..))"/>
<aop: advisor advice-ref="txAdvice" pointcut_ref="pc"/>
</aop:config>
事务属性
描述事务特征
隔离属性
@Transactional(isloation=)
描述并发特征
并发可能产生的问题
1)脏读:一个读取了另一个事务未提交的事务
解决 isloation=Isolation.READ_COMMITTED
2)不可重读
一个事务中两次读取数据不一样,导致数据不一致问题
解决 isloation=Isolation.REPEATABLE_READ 实质:一把行锁。
3)幻读
一个事务,多次对整表进行查询统计,结果不同,导致数据不一致。
解决 isloation=Isolation.Serializable 实质:一把表锁。
并发安全 Serializable>REPEATABLE_READ>READ_COMMITTED 运行效率相反
传播属性 Propagation
描述事务嵌套,大事务包含小事务,彼此影响,最终就会导致外部大事务丧失原子性。
只读属性readonly
异常属性
超时属性timeout
总结