Java-事务管理

1、事务的概念:
  事务指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部不成功。

2、 管理事务:

  2.1. 数据库默认的事务
    数据库默认支持事务的,但是数据库默认的事务是一条sql语句独占一个事务,这种模式,意义不大。
  2.2. 手动控制事务
    如果希望自己控制事务也是可以的:
    start transaction;
    -- 开启事务,在这条语句之后的所有的sql将处在同一事务中,要么同时完成要么同时不完成
      ......
    --事务中的sql在执行时,并没有真正修改数据库中的数据
    commit;
    -- 提交事务,将整个事务对数据库的影响一起发生
    rollback;
    -- 回滚事务,将这个事务对数据库的影响取消掉

   2.3. JDBC中控制事务
    Connection conn
    PreparedStatement pstat
    ResultSet rs
    当Jdbc程序向数据库获得一个Connection对象时,默认情况下这个Connection对象会自动向数据库提交在它上面发送的SQL语句。若想关闭这种默认提交方式,让多条SQL在一个事务中执行,可使用下列语句:
    conn.setAutoCommit(false);
    --关闭自动提交后,conn将不会帮我们提交事务,在这个连接上执行的所有sql语句将处在同一事务中,需要我们是手动的进行提交或回滚
    conn.commit();
    --提交事务
    conn.rollback();
    --回滚事务
    也可以设置回滚点回滚部分事务。
    Savepoint sp = conn.setSavepoint();
    conn.rollback(sp);
    --注意,回到回滚点后,回滚点之前的代码虽然没被回滚但是也没提交呢,如果想起作用还要做commit操作.

public class TranDemo {
    public static void main(String[] args) {
        Connection conn = null;
        PreparedStatement pstat = null;
        Savepoint sp =null;
        try{
            //String url = "jdbc:mysql://ip:3306/database";
            String url = "jdbc:mysql:///day20";
            Class.forName("com.mysql.jdbc.Driver");
            conn= DriverManager.getConnection(url,
                    "root", "root");
            //开启事务
            conn.setAutoCommit(false);
            //a-520
            pstat = conn.prepareStatement("update account set " +
                    "money=money-? where name=?");
            pstat.setDouble(1, 520);
            pstat.setString(2, "a");
            pstat.executeUpdate();
            //b+520
            pstat = conn.prepareStatement("update account set " +
                    "money=money+? where name=?");
            pstat.setDouble(1, 520);
            pstat.setString(2, "b");
            pstat.executeUpdate();
            //设置回滚点
            sp= conn.setSavepoint();
            //b消费了1040
            pstat = conn.prepareStatement("update account set " +
                    "money=money-? where name=?");
            pstat.setDouble(1, 1040);
            pstat.setString(2, "b");
            pstat.executeUpdate();
            //人为抛出一个异常
            int x = 3/0;
            //a+1040
            pstat = conn.prepareStatement("update account set " +
                    "money=money+? where name=?");
            pstat.setDouble(1, 1040);
            pstat.setString(2, "a");
            pstat.executeUpdate();
            //提交事务
            conn.commit();
        }catch (Exception e) {
            if(conn!=null){
                if(sp!=null){
                    try {
                        //回滚到到sp
                        conn.rollback(sp);
                        //将转账的操作提交
                        conn.commit();
                    } catch (SQLException e1) {
                        e1.printStackTrace();
                    }
                }else{
                    try {
                        //回滚事务开启的地方
                        conn.rollback();
                    } catch (SQLException e1) {
                        e1.printStackTrace();
                    }
                }
            }
        }finally{
            //关闭数据库连接。。。。
        }
    }
}
时间: 2024-12-12 07:42:23

Java-事务管理的相关文章

java事务管理 (转)

什么是事务: 首先,说说什么事务.我认为事务,就是一组操作数据库的动作集合. 事务是现代数据库理论中的核心概念之一.如果一组处理步骤或者全部发生或者一步也不执行,我们称该组处理步骤为一个事务.当所有的步骤像一个操 作一样被完整地执行,我们称该事务被提交.由于其中的一部分或多步执行失败,导致没有步骤被提交,则事务必须回滚到最初的系统状态. 事务必须服从ISO/IEC所制定的ACID原则.ACID是原子性(atomicity).一致性(consistency).隔离性 (isolation)和持久性

java事务管理

什么是事务: 事务,就是一组操作数据库的动作集合. 一组处理步骤或者全部发生或者一步也不执行,我们称该组处理步骤为一个事务.当所有的步骤像一个操作一样被完整地执行,我们称该事务被提交.由于其中的一部分或多步执行失败,导致没有步骤被提交,则事务必须回滚到最初的系统状态. 事务必须满足ACID原则.ACID是原子性(atomicity).一致性(consistency).隔离性(isolation)和持久性(durability)的缩写. 事务的原子性表示事务执行过程中的任何失败都将导致事务所做的任

java事务管理(二)

数据库事务和Spring事务是一般面试都会被提到,很多朋友写惯了代码,很少花时间去整理归纳这些东西,结果本来会的东西,居然吞吞吐吐答不上来. 下面是我收集到一些关于Spring事务的问题,希望能帮助大家过关. 事务是逻辑处理原子性的保证手段,通过使用事务控制,可以极大的避免出现逻辑处理失败导致的脏数据等问题. 事务最重要的两个特性,是事务的传播级别和数据隔离级别.传播级别定义的是事务的控制范围,事务隔离级别定义的是事务在数据库读写方面的控制范围. 事务的7种传播级别: 1)  PROPAGATI

Java数据库连接——JDBC调用存储过程,事务管理和高级应用

阅读目录 一.JDBC常用的API深入详解及存储过程的调用1.存储过程(Stored Procedure)的介绍2.JDBC调用无参存储过程3.JDBC调用含输入参数存储过程4.JDBC调用含输出参数存储过程二.JDBC的事务管理1.JDBC实现事务管理2.通过代码实现事物的管理三.数据库连接池(dbcp.c3p0)1.dbcp使用步骤2.c3p0使用步骤3.连接池总结四.JDBC的替代产品(Hibernate.Mybatis)1.Commons-dbutils 2.Hibernate简介3.M

Spring事务管理 ——》java service

java的事务处理,如果对数据库进行多次操作,每一次的执行或步骤都是一个事务.如果数据库操作在某一步没有执行或出现异常而导致事务失败,这样有的事务被执行有的就没有被执行,从而就有了事务的回滚,取消先前的操作..... 注:在Java中使用事务处理,首先要求数据库支持事务.如使用MySQL的事务功能,就要求MySQL的表类型为Innodb才支持事务.否则,在Java程序中做了commit或rollback,但在数据库中根本不能生效. 1.JavaBean中使用JDBC方式进行事务处理 public

Java学习-编程式的事务管理

编程式事务提供了TransactionTemplate 模板类,该类可以大大减少事务操作的代码.因此TransactionTemplate 采用Callback 避免让开发者重复书写其打开事务.提交事务及回滚事务等代码,同时TransactionTemplate 无须书写大量的try..catch 块. HibernateTemplate 必须提供PlatformTransactionManager 实例.该实例既可以在代码中手动设置,也可以使用Spring 的依赖注入.总之,只要获取了Plat

Java EE 事务管理

Open Group组织定义的分布式事务处理模型包括:应用程序(AP).事务管理器(TM).资源管理器(RM).通信资源管理器(CRM). 常见的事务管理器就是事务中间件(通常由应用服务器来实现).常见的资源管理器就是数据库.常见的通信管理器就是消息中间件. XA规范:Open Group组织为分布式事务指定的事务中间件与数据库之间的接口规范. XA规范的理论基础是两阶段提交协议. JTA 分布式事务管理 调用javax.transaction.UserTransacton接口的begin.co

Java框架spring 学习笔记(二十):事务管理(注解管理)

注解管理的方式要比xml配置方式要简单很多 只需在配置文件中添加事务注解 1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:tx="http://www.springframework.org/schema/tx" 4 xmlns:aop=&

Spring事务管理(详解+实例)

写这篇博客之前我首先读了<Spring in action>,之后在网上看了一些关于Spring事务管理的文章,感觉都没有讲全,这里就将书上的和网上关于事务的知识总结一下,参考的文章如下: Spring事务机制详解 Spring事务配置的五种方式 Spring中的事务管理实例详解 1 初步理解 理解事务之前,先讲一个你日常生活中最常干的事:取钱. 比如你去ATM机取1000块钱,大体有两个步骤:首先输入密码金额,银行卡扣掉1000元钱:然后ATM出1000元钱.这两个步骤必须是要么都执行要么都

SSM框架中使用Spring的@Transactional注解进行事务管理

一 介绍 在企业级应用中,保护数据的完整性是非常重要的一件事.因此不管应用的性能是多么的高.界面是多么的好看,如果在转账的过程中出现了意外导致用户的账号金额发生错误,那么这样的应用程序也是不可接受的 数据库的事务管理可以有效地保护数据的完整性(PS:关于数据库的事务管理基础可以参考我以前写过的这篇文章:http://www.zifangsky.cn/385.html),但是原生态的事务操作需要写不少的代码,无疑是非常麻烦的.在使用了Spring框架的应用中,我们可以使用@Transactiona