事务管理器
Mybatis(JdbcTeamplate))的事务管理器: DataSourceTransactionManager
Hibernate事务管理器:HibernateTransactionManager
事务的基本特性(ACID)
原子性:一个事务要么都提交要么都不提交
一致性:AB转账事务提交后总金额不发生改变
隔离性:事务隔离级别
read uncommitted 读未提交
存在:脏读 不可重复读 幻读
读取了另一个事务未提交的数据
read committed读已提交
存在:不可重复读 幻读
解决了脏读 读已提交,一个事务读到另一个事务已经提交的数据。
repeatable read:可重复读
存在: 幻读,针对 insert操作
一个事务中读到的数据始终保持一致,无论另一个事务是否提交
serializable:串行化
只能执行一个事务
持久性:一个事务一旦提交,它对数据库中数据的改变应该是永久性的
事务的传播 方法A 调用方法B AB中的事务的传播
@Transactional(propagation(传播) = Propagation.REQUIRED)
REQUIRED:没有事务创建 有加入事务
SUPPORTS:有事务就用没有就不用
一般情况下,生产环境中都是使用默认的Required
只读事务:优化手段
@Transactional(readOnly = true)用于查询
重点 声明事务
事务管理器 数据源 切面(切点+增强)
xml配置事务:
//事务管理器
//数据源
//配置增强处理
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<!--
<tx:method > 标签作用:批量设置切入点方法的事务属性
name属性:指定业务层的方法名称,可以使用*通配符
propagation属性:事务的传播行为,默认REQUIRED,可以省略
isolation属性:事务的隔离级别,默认使用数据库的隔离级别,可以省略
read-only属性:是否只读事务,默认为false,可以不填
-->
<tx:method name="find*" read-only="true" propagation="SUPPORTS"/>
<tx:method name="select*" read-only="true" propagation="SUPPORTS"/>
<tx:method name="*"></tx:method>
</tx:attributes>
</tx:advice>
<!--配置AOP声明式事务 配置切面 引入切点和增强处理-->
<aop:config>
<!--
配置aop的通知增强
advice-ref属性:设置外部标签的通知增强
pointcut属性:配置切入点(切入点表达式)
-->
<aop:advisor advice-ref="txAdvice" pointcut="execution( * com.itheima.service.*.*(..))"/>
</aop:config>
注解配置声明式事务:
<!--
配置事务管理器
-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!--配置数据源-->
<property name="dataSource" ref="dataSource"/>
</bean>
<!--配置注解事务支持-->
<tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>
@Transactional注解
指定类 方法都开启事务
指定方法 只有这个方法开启 (可以和类相互配合 优先选择类)
//查询propagation传播方式 readOnly只读 isolation隔离级别mysql默认REPEATABLE_READ(重复读)
@Transactional(propagation = Propagation.SUPPORTS,readOnly = true,isolation = Isolation.DEFAULT)
//增删改
@Transactional(propagation = Propagation.REQUIRED,readOnly = false,isolation = Isolation.REPEATABLE_READ)
JdbcTemplate
spring提供用于连数据库
设计模式
工厂模式 BeanFactory
单例模式 scope指定
动态代理 aop底层使用jdk动态代理和cglib动态代理
模板方法模式 JdbcTemplate对象,应用了模板方法模式