spring -事务

来源:互联网 发布:hz是什么意思网络用语 编辑:程序博客网 时间:2024/06/05 06:43

一、什么是事务?

     事务指的是逻辑上的一组操作,这组操作要么全部成功,要么全部失败。

二、事务的特性

    原子性:

          原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生.

    一致性:

          一致性指事务前后数据的完整性必须保持一致

    隔离性:

           隔离性指多个用户并发访问数据库时,一个用户的事务不能被其它用户的事务所干扰,多个并发事务之间数据要相互隔离。 


    持久性:

            持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,即使数据库发生故障也不应该对其有任何影响。

三、Spring的事务管理实现

1.编程式事务管理

 第一步: spring-core.xml

<!-- spring编程事务管理 --><bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"></property></bean><bean id="transactionManagerTemplate" class="org.springframework.transaction.support.TransactionTemplate"><property name="transactionManager" ref="transactionManager"></property></bean>第二步:业务层代码实现/** * 转账业务方法 * @param from 转账人 * @param to  收款人 * @param money  转账金额 * @throws SQLException  */public void transAccounts(String from, String to, int money) throws SQLException {transactionManagerTemplate.execute(new TransactionCallbackWithoutResult() {@Overrideprotected void doInTransactionWithoutResult(TransactionStatus status) {try {int oldFrom = accountSpringJdbcDaoImpl.getAccountMoney(from);int oldTo = accountSpringJdbcDaoImpl.getAccountMoney(to);accountSpringJdbcDaoImpl.updateAccountMoney(from, oldFrom-money); //1000-200//int i = 10/0;accountSpringJdbcDaoImpl.updateAccountMoney(to, oldTo+money); //1000+200 } catch (SQLException e) {e.printStackTrace();}}});}



2. 声明式事务管理

1>基于TransactionProxyFactoryBean的方式

2>基于AspectJ的XML方式

使用 asoectj 需要引入asoecty -jar包

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"></property></bean><tx:advice id="txAdivce" transaction-manager="transactionManager"><tx:attributes><tx:method name="find*" isolation="DEFAULT" propagation="REQUIRED" /><tx:method name="save*"  propagation="REQUIRED" /><tx:method name="update*" propagation="REQUIRED"/><tx:method name="*" propagation="REQUIRED"/></tx:attributes></tx:advice>    <aop:config>    <aop:pointcut expression="execution(* com.java1704.spring.transaction.server.*.*(..))" id="pointcut"/>    <aop:advisor advice-ref="txAdivce" pointcut-ref="pointcut"/>    </aop:config>

3>注解方式进行事务管理


<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"></property></bean><!-- 使用annotation定义事务 --><tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" />
/** * 转账业务方法 * @param from 转账人 * @param to  收款人 * @param money  转账金额 * @throws SQLException  */@Transactional(propagation=Propagation.REQUIRED,isolation=Isolation.DEFAULT)public void transAccounts(String from, String to, int money) throws SQLException {int oldFrom = accountDaoImpl.getAccountMoney(from);int oldTo = accountDaoImpl.getAccountMoney(to);accountDaoImpl.updateAccountMoney(from, oldFrom-money); //1000-200int i = 10/0;accountDaoImpl.updateAccountMoney(to, oldTo+money); //1000+200 }








原创粉丝点击