在javaweb操作中,当涉及到数据库的持久化操作的时候就有一个大人物需要提起:事务
1,在原始的开发中事务可以通过在spring中配置进行操作,基本的原理就是,在spring中加入相应的sessionfactory(不同
的持久化框架不一样,mybatis为sqlsessionfactory,hibernate为sessionfactory)然后依赖各个持久化层的提供的事务管
理器(依赖配置好的数据源)通过spring的aop配置,为service层添加事务(其实就是隐士的加了一些操作,在service方法
前将sessionfactory注入并打开事务,在service方法结束的时候关闭事务,发生错误回滚事务而已)
例子:以ssm开发为例:
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="configLocation"
value="classpath:hibernate.cfg.xml">
</property>
<property name="dataSource" ref="datasource"></property>
</bean>
<bean id="datasource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="maxPoolSize" value="${jdbc.pool.max}"></property>
<property name="initialPoolSize" value="${jdbc.pool.init}"></property>
<property name="acquireIncrement" value="${jdbc.pool.add}"></property>
</bean>
<!-- 事物管理器
对mybatis操作数据库事务控制spring使用jdbc的事务控制类
-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!-- 数据源 datasource在applicationContext-dao.xml中配置了-->
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 通知 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<!-- 传播行为 -->
<tx:method name="save*" propagation="REQUIRED"/>
<tx:method name="delete*" propagation="REQUIRED"/>
<tx:method name="insert*" propagation="REQUIRED"/>
<tx:method name="update*" propagation="REQUIRED"/>
<tx:method name="find*" propagation="SUPPORTS" read-only="true"/>
<tx:method name="get*" propagation="SUPPORTS" read-only="true"/>
<tx:method name="select*" propagation="SUPPORTS" read-only="true"/>
</tx:attributes>
</tx:advice>
<!-- aop -->
<aop:config>
<!-- 定义切入点 advice-ref定义切入点所要加入的通知 -->
<!-- 通知加在cn.edu.ssm.serviceimpl包下所有类的所有方法(任意参数) -->
<aop:advisor advice-ref="txAdvice" pointcut="execution(* cn.edu.service.*.*(..))"/>
</aop:config>
2,另一种关于事务的操作就是(因为是注解开发)开启注解事务在service层(需要进行事务控制的地方)通过注解的方式
添加事务操作
例子:以ssh为例:
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="annotatedClasses">
<list>
<value>Spitter.spitterOne.Spitter</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="dialect">org.hibernate.dialect.MySQLInnoDBDialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">true</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
</props>
</property>
</bean>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" >
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/spitter" />
<property name="username" value="root" />
<property name="password" value="root" />
<property name="initialSize" value="5"/>
<property name="maxActive" value="10" />
</bean>
<!-- 设定transactionManager -->
<bean id="txManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<!--启动spring事务注解功能-->
<tx:annotation-driven transaction-manager="txManager"/>
3,总之,上面的两种操作,都可以达到事务管理,各有利弊,第一种配置麻烦,而且控制事务是统筹性质的,不能够做到
对于具体操作实行特定事物,而第二种可以弥补第一种的缺点,但是他的缺点是每一个方法都需要进行注解,比较麻烦
1,在原始的开发中事务可以通过在spring中配置进行操作,基本的原理就是,在spring中加入相应的sessionfactory(不同
的持久化框架不一样,mybatis为sqlsessionfactory,hibernate为sessionfactory)然后依赖各个持久化层的提供的事务管
理器(依赖配置好的数据源)通过spring的aop配置,为service层添加事务(其实就是隐士的加了一些操作,在service方法
前将sessionfactory注入并打开事务,在service方法结束的时候关闭事务,发生错误回滚事务而已)
例子:以ssm开发为例:
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="configLocation"
value="classpath:hibernate.cfg.xml">
</property>
<property name="dataSource" ref="datasource"></property>
</bean>
<bean id="datasource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="maxPoolSize" value="${jdbc.pool.max}"></property>
<property name="initialPoolSize" value="${jdbc.pool.init}"></property>
<property name="acquireIncrement" value="${jdbc.pool.add}"></property>
</bean>
<!-- 事物管理器
对mybatis操作数据库事务控制spring使用jdbc的事务控制类
-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!-- 数据源 datasource在applicationContext-dao.xml中配置了-->
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 通知 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<!-- 传播行为 -->
<tx:method name="save*" propagation="REQUIRED"/>
<tx:method name="delete*" propagation="REQUIRED"/>
<tx:method name="insert*" propagation="REQUIRED"/>
<tx:method name="update*" propagation="REQUIRED"/>
<tx:method name="find*" propagation="SUPPORTS" read-only="true"/>
<tx:method name="get*" propagation="SUPPORTS" read-only="true"/>
<tx:method name="select*" propagation="SUPPORTS" read-only="true"/>
</tx:attributes>
</tx:advice>
<!-- aop -->
<aop:config>
<!-- 定义切入点 advice-ref定义切入点所要加入的通知 -->
<!-- 通知加在cn.edu.ssm.serviceimpl包下所有类的所有方法(任意参数) -->
<aop:advisor advice-ref="txAdvice" pointcut="execution(* cn.edu.service.*.*(..))"/>
</aop:config>
2,另一种关于事务的操作就是(因为是注解开发)开启注解事务在service层(需要进行事务控制的地方)通过注解的方式
添加事务操作
例子:以ssh为例:
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="annotatedClasses">
<list>
<value>Spitter.spitterOne.Spitter</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="dialect">org.hibernate.dialect.MySQLInnoDBDialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">true</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
</props>
</property>
</bean>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" >
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/spitter" />
<property name="username" value="root" />
<property name="password" value="root" />
<property name="initialSize" value="5"/>
<property name="maxActive" value="10" />
</bean>
<!-- 设定transactionManager -->
<bean id="txManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<!--启动spring事务注解功能-->
<tx:annotation-driven transaction-manager="txManager"/>
3,总之,上面的两种操作,都可以达到事务管理,各有利弊,第一种配置麻烦,而且控制事务是统筹性质的,不能够做到
对于具体操作实行特定事物,而第二种可以弥补第一种的缺点,但是他的缺点是每一个方法都需要进行注解,比较麻烦