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. 关于如何利用原生js动态给一个空对象添加属性以及属性值

    首先,回忆一下,访问对象属性一共有两种方法:点获取法和方括号获取法.而我们最常用的就是点获取法了.但是当我们遇到需要给对象动态添加属性和属性值时,点获取法好像就不太好用了,尤其是我们不知道属性名的时候 ...

  2. idea tomcat 启动报错 org.apache.catalina.core.StandardService.initInternal Failed to initialize connector

    org.apache.catalina.core.StandardService.initInternal Failed to initialize connector org.apache.cata ...

  3. hdu 1285 确定比赛名次 (拓扑)

    确定比赛名次 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Subm ...

  4. Codeforces数据结构(水题)小结

    最近在使用codeblock,所以就先刷一些水题上上手 使用codeblock遇到的问题 1.无法进行编译-------从setting中的编译器设置中配置编译器 2.建立cpp后无法调试------ ...

  5. Word2010 自动生成二级编号

    http://jingyan.baidu.com/article/3ea5148901919752e61bbafe.html

  6. 【COGS 1873】 [国家集训队2011]happiness(吴确) 最小割

    这是一种最小割模型,就是对称三角,中间双向边,我们必须满足其最小割就是满足题目条件的互斥关系的最小舍弃,在这道题里面我们S表示文T表示理,中间一排点是每个人,每个人向两边连其选文或者选理的价值,中间每 ...

  7. JavaBean定义、JSP中使用以及内省操作

        Apache commons 一系列的开源工具室非常值得学习的实现. 一 JavaBean定义     JavaBean是一种可重复使用.且跨平台的软件组件.JavaBean可分为两种:一种是 ...

  8. JQuery如何监听DIV内容变化

    这几天在做一个微博的接入,需要判断微博是否被关注,要检查微博标签的DIV是否有“已关注”的字符,但这个DIV的内容是微博JSSDK动态生 成.$("#id").html()是获取不 ...

  9. Lucene4.6查询时完全跳过打分,提高查询效率的实现方式

    由于索引的文件量比较大,而且应用中不需要对文档进行打分,只需要查询出所有满足条件的文档.所以需要跳过打分来提高查询效率.一开始想用ConstantScoreQuery,但是测试发现这个类虽然让所有返回 ...

  10. 修改nginx对http请求数据大小限制

    1. 问题发现 在公司搭建了一个基于mindoc的wiki知识库,用nginx做的反向代理服务器,同事在使用过程中上传某个文件一直失败,于是看着看下mindoc自己的日志文件,发现都是类似于fastd ...