Spring事务管理

什么是事务?

  事务是逻辑上的一组操作,要么都执行,要么都不执行
事务的特性:

  1,原子性:

      事务是最小的执行单位,不允许分割,事务的原子性确保动作要么全部完成,要么完全不起作用

  2,一致性:

      执行事务之前数据保持一致

  3,隔离性:

      并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库是独立的

  4,持久性:

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

事务管理的方式:

  1,编程时事务管理

      是通过编写代码实现的事务管理,包括定义事务的开始,正常执行后的事务提交和异常时事务回滚

  2,声明式事务管理

      是通过AOP技术实现的事务管理,其主要思想是将事务管理作为一个“切面”代码单独编写,然后通过AOP技术将事务管理的“切面”代码织入到

区别:

  简单地说,编程式事务侵入到了业务代码里面,但是提供了更加详细的事务管理,而声明式事务由于基于AOP

  所以既能起到事务管理的作用,又可以不影响业务代码的具体实现

实例代码:

  编写dao层

  

 

   

public class AccountDaoImpl implements AccountDao {

    private JdbcTemplate jdbcTemplate;

    public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }
    
    @Transactional(propagation=Propagation.REQUIRED,isolation=Isolation.DEFAULT,readOnly=false)
    @Override
    public void transfer(String outUser, String inUser, Double money) {
        // TODO Auto-generated method stub
        // 收款时,收款用户的余额 =现有资金+所汇金额
        this.jdbcTemplate.update(
                "update account set balance = balance+? where username=?",
                money, inUser);
        
        // 0不能做分母  所以这里一定出现bug
//        int i = 1/0;
        
        // 汇款时,汇款用户的余额 =现有资金-所汇金额
        this.jdbcTemplate.update(
                "update account set balance = balance-? where username=?",
                money, outUser);
        
    }

    实体类

 

     配置文件

 

    <!-- 1、配置数据源 -->
    <bean id="dataSource"
        class="org.springframework.jdbc.datasource.DriverManagerDataSource">

        <!-- 数据库驱动 -->
        <property name="driverClassName" value="com.mysql.jdbc.Driver" />
        <!-- 链接数据库的url -->
        <property name="url" value="jdbc:mysql://localhost:3306/demo" />
        <!-- 链接数据库的用户名 -->
        <property name="username" value="root" />
        <!-- 链接数据库的密码 -->
        <property name="password" value="123456" />

    </bean>

    <!-- 2、配置JDBC模板 里面封装好了crud(增删改查)代码 使用前提是得先链接数据库 -->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">

        <!-- 默认必须使用数据源 -->
        <property name="dataSource" ref="dataSource" />

    </bean>

    <!-- 3、定义id为accountDao的bean -->
    <bean id="accountDao" class="com.bdqn.cn.dao.AccountDaoImpl">


        <property name="jdbcTemplate" ref="jdbcTemplate" />


    </bean>

    <!-- 4、事务管理器,依赖于数据源 -->
    <bean id="transactionManager"
        class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

        <property name="dataSource" ref="dataSource" />

    </bean>

    <!-- 5、注册事务管理器驱动 -->
    <tx:annotation-driven transaction-manager="transactionManager" />

 

 

 

    测试类

 

 

 

 

 

posted @ 2020-04-10 13:07  拯代码  阅读(205)  评论(0编辑  收藏  举报