Spring学习04


与持久层整合

基于模板设计模式与持久层进行整合

与Mybatis整合

Mybatis-config

  1. 数据源配置
  2. 别名配置
  3. Mapper文件配置

SqlSessionFactoryBean

  • dataSource
  • typeAliasesPackage
  • mapperLocations

MapperScannerConfigure

  • sqlSessionFactoryBeanName
  • basePackage
<bean id="dateSource" class="com.alibaba.druid.pool.DruidDataSource">
    <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://mysql:3306/test?useSSL=false"/>
    <property name="username" value="root"/>
    <property name="password" value="123456"/>
</bean>
<bean id="ssfb" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dateSource"/>
    <property name="typeAliasesPackage" value="com.tonkia.mybatis.pojo"/>
    <property name="mapperLocations">
        <list>
            <value>classpath*:*Mapper.xml</value>
        </list>
    </property>
</bean>
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <property name="sqlSessionFactoryBeanName" value="ssfb"/>
    <property name="basePackage" value="com.tonkia.mybatis.dao"/>
</bean>

classpath:只会到指定的class路径中查找文件
classpath*:不仅包含class路径,还包括jar文件中(class路径)进行查找

事务处理

要么都发生,要么都不发生(业务开发中比较重要)

四大特点

  • A:原子性
  • C:一致性
  • I:隔离性
  • D:持久性

JDBC

Connection.setAutoCommit(false);
Connection.commit();
COnnection.rollback();

Mybatis

# 自动开启事务
sqlSession.commit();
sqlSession.rollback();
Spring控制事务开发

通过AOP完成

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dateSource"/>
</bean>

<tx:annotation-driven transaction-manager="transactionManager"/>

使用@Transactional指定控制事务的切点

事务属性

描述事务特征一系列值

  1. 隔离属性:isolation
  2. 传播属性:propagation
  3. 只读属性:readOnly
  4. 超时属性:timeout
  5. 异常属性:rollbackFor,noRollbackFor
隔离属性(isolation)

描述了事务解决并发问题的特征
并发:多个事务(用户)访问了同一个数据,导致

  • 脏读:一个事务读了另外一个数据没有提交的数据(isolation = Isolation.READ_COMMITED
  • 不可重复读:多次读取相同数据但是结果不一致(isolation = Isolation.REPEATABLE_READ)行锁
  • 幻影读:多次对表统计,但是结果不一致(isolation = Isolation.SERIALIZABLE)表锁

数据库支持

  • READ_COMMITED:MySQL、Oracle
  • REPEATABLE_READ:MySQL
  • SERIALIZABLE:MySQL、Oracle

默认隔离级别
ISOLATION_DEFAULT:调用不同数据库设置的隔离级别
MySQL:REPEATABLE_READ
Oracle:READ_COMMITED

select @@tx_isolation

在这里插入图片描述
实战中使用默认
如果真遇到并发问题使用乐观锁(Version)

传播属性(propagation)

解决事务嵌套问题
Service调用Service可以出现事务嵌套
大事务嵌套小事务导致大事务丧失原子性

  • REQUIRED(默认):增删改
  • SUPPORTS:查
  • REQUIRES_NEW:日志
  • NOT_SUPPORTED
  • NEVER
  • MANDATORY

在这里插入图片描述

只读属性(read-only)

针对于只进行查询的业务,可以提高运行效率,默认为false

超时属性(timeout)

并发操作等待
超时则抛出异常,默认值为-1(由数据库来决定)

异常属性

默认

  • 对于RuntimeException及其子类,回滚
  • Exception及其子类,提交
  • rollbackFor = { }
  • notRollbackFor = { }
实践使用

增删改:@Transitianal
查:@Transitianal(propagation = Propagation.SUPPORTS, readOnly = true)

基于标签的事务配置方式
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dateSource"/>
</bean>
<tx:advice transaction-manager="transactionManager" id="txAdvice">
    <tx:attributes>
        <!--有优先级-->
        <tx:method name="update*"/>
        <tx:method name="del*"/>
        <tx:method name="insert*"/>
        <tx:method name="select*" propagation="SUPPORTS" read-only="true"/>
        <tx:method name="*" propagation="SUPPORTS" read-only="true"/>
    </tx:attributes>
</tx:advice>
<aop:config>
    <aop:pointcut id="pc" expression="execution(* com.tonkia.mybatis.service..*.*(..))"/>
    <aop:advisor advice-ref="txAdvice" pointcut-ref="pc"/>
</aop:config>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值