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{
//关闭数据库连接。。。。
}
}
}

Java-事务管理的更多相关文章

  1. Java事务管理之Spring+Hibernate

    环境与版本 除了上一篇中的hibernate的相关lib 外 Java事务管理之Hibernate 还需要加入Spring的lib 包和如下的一些依赖包 org.aopallianceorg.aspe ...

  2. java事务管理

    一.什么是Java事务 通常的观念认为,事务仅与数据库相关. 事务必须服从ISO/IEC所制定的ACID原则.ACID是原子性(atomicity).一致性(consistency).隔离性(isol ...

  3. Java事务管理之Hibernate

    环境与版本 Hibernate 版本:Hibernate 4.2.2 (下载后的文件名为hibernate-release-4.2.2.Final.zip,解压目录hibernate-release- ...

  4. Java事务管理之JDBC

    前言 关于Java中JDBC的一些使用可以参见: Java 中使用JDBC连接数据库例程与注意事项 在使用JDBC的使用, 如何进行事务的管理.直接看一下代码 示例代码 /** * @Title: J ...

  5. java事务管理(二)

    数据库事务和Spring事务是一般面试都会被提到,很多朋友写惯了代码,很少花时间去整理归纳这些东西,结果本来会的东西,居然吞吞吐吐答不上来. 下面是我收集到一些关于Spring事务的问题,希望能帮助大 ...

  6. 【sping揭秘】22、事务管理

    有关事务的楔子 什么是事务??? 事务就是以可控的方式对数据资源进行访问的一组操作. 事务本身持有四个限定属性 原子性,一致性,隔离性,持久性 事务家族 Resource Manager  RM,负责 ...

  7. 【Java EE 学习 54】【OA项目第一天】【SSH事务管理不能回滚问题解决】【struts2流程回顾】

    一.SSH整合之后事务问题和总结 1.引入问题:DAO层测试 假设将User对象设置为懒加载模式,在dao层使用load方法. 注意,注释不要放开. 使用如下的代码块进行测试: 会报错:no sess ...

  8. 【Java EE 学习 52】【Spring学习第四天】【Spring与JDBC】【JdbcTemplate创建的三种方式】【Spring事务管理】【事务中使用dbutils则回滚失败!!!??】

    一.JDBC编程特点 静态代码+动态变量=JDBC编程. 静态代码:比如所有的数据库连接池 都实现了DataSource接口,都实现了Connection接口. 动态变量:用户名.密码.连接的数据库. ...

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

    一.JDBC常用的API深入详解及存储过程的调用 相关链接:Jdbc调用存储过程 1.存储过程(Stored Procedure)的介绍 我们常用的操作数据库语言SQL语句在执行的时候需要先编译,然后 ...

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

    相关链接:Jdbc调用存储过程 一.JDBC常用的API深入详解及存储过程的调用 1.存储过程的介绍 我们常用的操作数据库语言SQL语句在执行的时候要先进行编译,然后执行,而存储过程是在大型数据库系统 ...

随机推荐

  1. 如何控制DBGrid里面显示的浮点数小数点后的位数?

    现在dbgrid里面显示的位数太多,有10几位,根本没办法看.请问怎么设置能控制小数点后的位数呢?在c语言里面是  %7.2f就可以了,可惜不知道dephi里面怎么做啊谢谢各位指点 方法1:  把那些 ...

  2. sqoop将oracle数据导入hdfs集群

    使用sqoop将oracle数据导入hdfs集群 集群环境: hadoop1.0.0 hbase0.92.1 zookeeper3.4.3 hive0.8.1 sqoop-1.4.1-incubati ...

  3. 【题解】[国家集训队]Crash的数字表格 / JZPTAB

    求解\(\sum_{i = 1}^{n}\sum_{j = 1}^{m}lcm\left ( i,j \right )\). 有\(lcm\left ( i,j \right )=\frac{ij}{ ...

  4. 种树 by yoyoball [树分块+bitset]

    题面 给定一棵树,有点权 每次询问给出一些点对,求这些点对之间的路径的并集上不同权值的个数,以及这些权值的$mex$ 思路 先考虑只有一对点对,只询问不同权值个数的问题:树上莫队模板题 然后加个$me ...

  5. BZOJ5322 [Jxoi2018]排序问题 【贪心】

    题目链接 BZOJ5322 题解 意思就是使有序的排列尽量少 就是使相同的数尽量少 然后大力贪心即可 #include<algorithm> #include<iostream> ...

  6. makefile使用笔记(一)入门

    By francis_hao    Mar 2,2017 makefile makefile一个很简单的例子如下,该实例完成在执行make时,将main.c编译成可执行文件main的功能. 各项的含义 ...

  7. poj3133 Manhattan Wiring

    Manhattan Wiring Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 2016   Accepted: 1162 ...

  8. sysctl -P net.bridge.bridge-nf-call-ip6tables报错解决办法

    问题症状 修改 linux 内核文件 #vi /etc/sysctl.conf后执行sysctl  -P 报错 error: "net.bridge.bridge-nf-call-ip6ta ...

  9. CentOS 64位上编译 Hadoop2.6.0

    由于hadoop-2.6.0.tar.gz安装包是在32位机器上编译的,64位的机器加载本地库.so文件时会出错,比如: java.lang.UnsatisfiedLinkError: org.apa ...

  10. PHP正则替换preg_replace函数的使用

    <?php $str="as2223adfsf0s4df0sdfsdf"; echo preg_replace("/0/","",$s ...