spring事务管理的抽象层的三个接口:
1 TransactionDefinition
2 PlatFormTransactionManager
3 TransactionStatus
Spring JDBC和MyBatis———–基于数据源的Connection访问数据库
配置文件:
1 配置数据源
2 配置事务管理器
<!-- spring JDBC和myBatis的配置文件 -->
<!-- 配置数据源 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<!-- 数据库驱动 -->
<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
<!-- url -->
<property name="url" value="jdbc:mysql://localhost:3306/test"></property>
<!-- 用户名 -->
<property name="username" value="root"></property>
<!-- 密码 -->
<property name="password" value="root"></property>
</bean>
<!-- 配置基于数据源的事务管理器 -->
<bean id="dataSourceManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!-- 注入数据源 -->
<property name="dataSource" ref="dataSource"></property>
</bean>
Hibernate3.0及以上
配置文件:
1 配置数据源
2 配置sessionFactory
3 配置事务管理器
<!-- hibernate的配置文件 -->
<!-- 配置数据源 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<!-- 数据库驱动 -->
<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
<!-- url -->
<property name="url" value="jdbc:mysql://localhost:3306/test"></property>
<!-- 用户名 -->
<property name="username" value="root"></property>
<!-- 密码 -->
<property name="password" value="root"></property>
</bean>
<!-- 配置sessionFactory -->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<!-- 注入数据源 -->
<property name="dataSource" ref="dataSource"></property>
<!-- 指定hibernate的映射文件 -->
<property name="mappingResources" value="classpath:KeyWords.hbm.xml"></property>
<!-- 配置hibernate的其他属性 -->
<property name="hibernateProperties">
<props>
<!-- 配置数据库方言 -->
<prop key="hibernate.dialect">${hibernate.dialect}</prop>
<!-- 配置sql语句是否打印出来 -->
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
</bean>
<!-- 配置事务管理器 -->
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<!-- 注入sessionFactory -->
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
事务同步管理器
JDBC的connection,Hibernate的session等访问数据库的连接或会话对象在同一时刻是不能多线程共享的,即是线程不安全的,
DAO层的数据访问对象和service层的服务对象要想实现单例,首先应将其属性即connection或session变成线程安全的,
spring的同步事务管理器 TransactionSychronizedManager正是通过ThreadLocal为不同事务线程提供了独立的资源副本,实现了线程安全;
使用spring提供的线程绑定资源获取工具类可以获取当前线程绑定的资源(connection或session等访问数据库的连接或会话对象):
1 通过线程绑定资源获取工具类获取当前事务线程绑定的资源
2 绑定资源的过程是由spring的事务同步管理器通过ThreadLocal完成的
3 不同的持久化实现对应不同的线程绑定资源获取工具类
public KeyWords selectKeyWord(KeyWords keyWords) {
//Connection connection=DataSourceUtils.getConnection(dataSource);
return null;
}
事务的传播行为:
当我们调用一个基于spring的service接口方法时,它将运行于spring管理的事务环境中,service接口方法内部可能会调用其他的service接口方法以共同完成一个完整的业务操作,因此就会出现服务接口方法嵌套调用的情况,
spring通过事务传播行为控制当前事务如何传播到被嵌套调用的目标服务接口方法中;
事务管理有两种:
1 编程式事务管理
2 声明式事务管理