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. Flink之状态之状态存储 state backends

    流计算中可能有各种方式来保存状态: 窗口操作 使用 了KV操作的函数 继承了CheckpointedFunction的函数 当开始做checkpointing的时候,状态会被持久化到checkpoin ...

  2. stap中的entry函数

    只有在ret probe函数中,在这个函数中才会使用@entry函数去提取变量 是因为ret probe 有什么特殊的吗?在中间这个变量会变化吗? A new operator, @entry, is ...

  3. php在类里如何调用call_user_func_array《细说php2》

  4. JavaScript获取访问设备信息

    <html xmlns=http://www.w3.org/1999/xhtml> <head> <title>JavaScript获取访问设备信息</tit ...

  5. 一张图彻底搞懂JavaScript的==运算

    一张图彻底搞懂JavaScript的==运算 来源 https://zhuanlan.zhihu.com/p/21650547 PS:最后,把图改了一下,仅供娱乐 : ) 大家知道,==是JavaSc ...

  6. 【题解】Bzoj4316小C的独立集

    决定要开始学习圆方树 & 仙人掌相关姿势.加油~~ 其实感觉仙人掌本质上还是一棵树,长得也还挺优美的.很多的想法都可以往树的方面上靠,再针对仙人掌的特性做出改进.这题首先如果是在树上的话那么实 ...

  7. mysql5.7 MRG集群部署学习

    文章目录 1.安装mysql 2.修改配置文件: 3.安装group_replicatin插件,启动group_replication 4.添加节点node-02 node-03: 有关复制组的相关原 ...

  8. 【BZOJ 4514】[Sdoi2016]数字配对 费用流

    利用spfa流的性质,我直接拆两半,正解分奇偶(妙),而且判断是否整除且质数我用的是暴力根号,整洁判断质数个数差一(其他非spfa流怎么做?) #include <cstdio> #inc ...

  9. Spring中Resource接口的前缀书写格式

    Resource template = ctx.getResource("classpath:some/resource/path/myTemplate.txt");   //这个 ...

  10. ubunut14.04 mentohust配置

      1.设置网卡eth0的IP地址和子网掩码 sudo ifconfig eth0 10.162.32.94 netmask 255.0.0.0 将IP地址改为:10.162.32.94,子网掩码改为 ...