zoukankan      html  css  js  c++  java
  • 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" />

        测试类

     

  • 相关阅读:
    Python中的logging模块
    Windows 域(domain)
    linux下查看某软件是否已安装, ubuntu安装deb包
    linux之iptables
    linux之flock函数锁文件
    《上班赚钱,下班理财》
    Get the image file(s) some informations,Including the Make,Model,Date/Time,etc
    java中的Integer的toBinaryString()方法
    面试题中遇到的SQL题目
    get和post方法的区别
  • 原文地址:https://www.cnblogs.com/yz-bky/p/12672815.html
Copyright © 2011-2022 走看看