• 事务


    事务概述

    ●在JavaEE企业级开发的应用领域,为了保证数据的完整性一致性,必须引入数据库事务的概念,所以事务管理是企业级应用程序开发中必不可少的技术。

    ●事务就是一组由于逻辑上紧密关联而合并成一个整体(工作单元)的多个数据库操作,这些操作要么都执行要么都不执行

    ●事务的四个关键属性(ACID)

    原子性(atomicity):“原子”的本意是“不可再分”,事务的原子性表现为一个事务中涉及到的多个操作在逻辑上缺一不可。事务的原子性要求事务中的所有操作要么都执行,要么都不执行。

    一致性(consistency):“一致”指的是数据的一致,具体是指:所有数据都处于满足业务规则的一致性状态。一致性原则要求:一个事务中不管涉及到多少个操作,都必须保证事务执行之前数据是正确的,事务执行之后数据仍然是正确的。如果一个事务在执行的过程中,其中某一个或某几个操作失败了,则必须将其他所有操作撤销,将数据恢复到事务执行之前的状态,这就是回滚

    隔离性(isolation):在应用程序实际运行过程中,事务往往是并发执行的,所以很有可能有许多事务同时处理相同的数据,因此每个事务都应该与其他事务隔离开来,防止数据损坏。隔离性原则要求多个事务在并发执行过程中不会互相干扰

    持久性(durability):持久性原则要求事务执行完成后,对数据的修改永久的保存下来,不会因各种系统错误或其他意外情况而受到影响。通常情况下,事务对数据的修改应该被写入到持久化存储器中。

    简单实现

    配置文件

    <!-- 配置事务管理器 -->
    
    <bean id="transactionManager" 
    
      class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    
    <property name="dataSource" ref="dataSource"/>   
    
    </bean>
    
     
    
    <!-- 启用事务注解 -->
    
    <tx:annotation-driven transaction-manager="transactionManager"/>

    在需要进行事务控制的方法上加注解

    @Transactional

    简单程序

    public void test() {
            Connection con=null;
            con = JDBCUtil.getConnection();
            String sql="insert into lhw_wad values(null,?)";
            PreparedStatement ps =null;
            try {
                //开启事务需要手动提交
                //同一个事务要获取同一个Connection
                con.setAutoCommit(false);
                //批处理
                ps = con.prepareStatement(sql);
                long start = System.currentTimeMillis();
                for (int i = 0; i < 1000; i++) {
                    ps.setString(1, "qq"+i);
                    ps.addBatch();
                }
                ps.executeBatch();
                long end = System.currentTimeMillis();
                System.out.println(end- start);
                
                con.commit();
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                try {
                    con.rollback();
                } catch (SQLException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
                e.printStackTrace();
            }finally {
                try {
                    con.close();
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            
        }

    dao层(注意dao层不要关闭Connection,一个事务公用一个Connection)

    public class Acount {
        
        public void update(Connection con,Integer id, Integer count){
            PreparedStatement ps=null;
            String sql="update l_bank set  money=money+? where id=?";
            try {
                ps = con.prepareStatement(sql);
                ps.setInt(1, count);
                ps.setInt(2, id);
                ps.executeUpdate();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            finally {
                JDBCUtil.close(null, ps, null);
            }
        }
    
    }
    View Code
  • 相关阅读:
    Eclipse中添加MyEclipse插件
    用GWT开发的HelloGWT程序
    GWT module 'xxx' may need to be (re)compiled解决办法
    GWTDesigner_v5.1.0破解码
    Firefox火狐广告过滤插件Adblock Plus过滤规则包[中文维护小组]
    工程师们,不要想一辈子靠技术混饭吃
    PHP生成类似类似优酷、腾讯视频等其他视频链的ID
    (外挂破解)Cheat Engine(内存修改工具)V6.2中文版软件介绍
    ucos-ii核心算法分析(转)
    Websocket,ProtoBuffer,Hightlight,JSON 等,最近遇到的一些知识点小结
  • 原文地址:https://www.cnblogs.com/Ysuwade/p/7455101.html
Copyright © 2020-2023  润新知