文章目录
与持久层整合
基于模板设计模式与持久层进行整合
与Mybatis整合
Mybatis-config
- 数据源配置
- 别名配置
- 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
指定控制事务的切点
事务属性
描述事务特征一系列值
- 隔离属性:isolation
- 传播属性:propagation
- 只读属性:readOnly
- 超时属性:timeout
- 异常属性: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>