模拟转账成功时的业务场景

 import java.sql.*;

 public class TransactionDemo1 {

     public static void main(String[] args) throws SQLException, ClassNotFoundException {
String url = "jdbc:mysql://localhost/xh";
String username = "xiaohengdada";
String password = "123456"; Class.forName("org.gjt.mm.mysql.Driver");
Connection conn = null;
PreparedStatement st = null;
ResultSet rs = null; try {
conn = DriverManager.getConnection(url, username, password);
conn.setAutoCommit(false);// 通知数据库开启事务(start transaction)
String sql1 = "update account set money=money+100 where name='A'";
st = conn.prepareStatement(sql1);
int num1 = st.executeUpdate();
if (num1 > 0) {
System.out.println("succeed to update A ");
}
String sql2 = "update account set money=money-100 where name='B'";
st = conn.prepareStatement(sql2);
int num2 = st.executeUpdate();
if (num2 > 0) {
System.out.println("succeed to update B ");
}
conn.commit();// 上面的两条SQL执行Update语句成功之后就通知数据库提交事务(commit)
System.out.println("成功!!!"); // log4j
} catch (Exception e) {
e.printStackTrace();
} finally {
// rs.close();
st.close();
conn.close();
}
}
}

 import java.sql.*;

 public class TransactionDemo1 {
public static void main(String[] args) throws SQLException, ClassNotFoundException {
String url = "jdbc:mysql://localhost/xh";
String username = "xiaohengdada";
String password = "123456"; Class.forName("org.gjt.mm.mysql.Driver");
Connection conn = null;
PreparedStatement st = null;
ResultSet rs = null; try {
conn = DriverManager.getConnection(url, username, password);
conn.setAutoCommit(false);// 通知数据库开启事务(start transaction)
String sql1 = "update account set money=money-100 where name='A'";
st = conn.prepareStatement(sql1);
st.executeUpdate();
// 用这句代码模拟执行完SQL1之后程序出现了异常而导致后面的SQL无法正常执行,事务也无法正常提交,此时数据库会自动执行回滚操作
int x = 1 / 0;
String sql2 = "update account set money=money+100 where name='B'";
st = conn.prepareStatement(sql2);
st.executeUpdate();
conn.commit();// 上面的两条SQL执行Update语句成功之后就通知数据库提交事务(commit)
System.out.println("成功!!!");
} catch (Exception e) {
e.printStackTrace();
} finally {
st.close();
conn.close();
}
}
}

 import java.sql.*;

 public class TransactionDemo1 {
public static void main(String[] args) throws SQLException, ClassNotFoundException {
String url = "jdbc:mysql://localhost/xh";
String username = "xiaohengdada";
String password = "123456"; Class.forName("org.gjt.mm.mysql.Driver");
Connection conn = null;
PreparedStatement st = null;
ResultSet rs = null; try{
conn = DriverManager.getConnection(url,username,password);
conn.setAutoCommit(false);//通知数据库开启事务(start transaction)
String sql1 = "update account set money=money-100 where name='A'";
st = conn.prepareStatement(sql1);
st.executeUpdate();
//用这句代码模拟执行完SQL1之后程序出现了异常而导致后面的SQL无法正常执行,事务也无法正常提交
int x = 1/0;
String sql2 = "update account set money=money+100 where name='B'";
st = conn.prepareStatement(sql2);
st.executeUpdate();
conn.commit();//上面的两条SQL执行Update语句成功之后就通知数据库提交事务(commit)
System.out.println("成功!!!");
}catch (Exception e) {
try {
//捕获到异常之后手动通知数据库执行回滚事务的操作
conn.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
e.printStackTrace();
}finally{ }
}
}

设置回滚点:

 import java.sql.*;

 public class TransactionDemo1 {
public static void main(String[] args) throws SQLException, ClassNotFoundException {
String url = "jdbc:mysql://localhost/xh";
String username = "xiaohengdada";
String password = "123456"; Class.forName("org.gjt.mm.mysql.Driver");
Connection conn = null;
PreparedStatement st = null;
ResultSet rs = null;
Savepoint sp = null; try {
conn = DriverManager.getConnection(url, username, password);
conn.setAutoCommit(false);// 通知数据库开启事务(start transaction) String sql1 = "update account set money=money-100 where name='A'";
st = conn.prepareStatement(sql1);
st.executeUpdate(); // 设置事务回滚点
// sp = conn.setSavepoint(); String sql2 = "update account set money=money+100 where name='B'";
st = conn.prepareStatement(sql2);
st.executeUpdate(); sp = conn.setSavepoint();
// 程序执行到这里出现异常,后面的sql3语句执行将会中断
int x = 1 / 0; String sql3 = "update account set money=money+100 where name='C'";
st = conn.prepareStatement(sql3);
st.executeUpdate(); conn.commit(); } catch (Exception e) {
try {
/**
* 我们在上面向数据库发送了3条update语句, sql3语句由于程序出现异常导致无法正常执行,数据库事务而已无法正常提交,
* 由于设置的事务回滚点是在sql1语句正常执行完成之后,sql2语句正常执行之前,
* 那么通知数据库回滚事务时,不会回滚sql1执行的update操作
* 只会回滚到sql2执行的update操作,也就是说,上面的三条update语句中,sql1这条语句的修改操作起作用了
* sql2的修改操作由于事务回滚没有起作用,sql3由于程序异常没有机会执行
*/
conn.rollback(sp);// 回滚到设置的事务回滚点
// 回滚了要记得通知数据库提交事务
conn.commit();
} catch (SQLException e1) {
e1.printStackTrace();
}
e.printStackTrace();
} finally {
}
}
}

java连接mysql(二)的更多相关文章

  1. Java进阶(二十五)Java连接mysql数据库(底层实现)

    Java进阶(二十五)Java连接mysql数据库(底层实现) 前言 很长时间没有系统的使用java做项目了.现在需要使用java完成一个实验,其中涉及到java连接数据库.让自己来写,记忆中已无从搜 ...

  2. 【JDBC】Java 连接 MySQL 基本过程以及封装数据库工具类

    一. 常用的JDBC API 1. DriverManager类 : 数据库管理类,用于管理一组JDBC驱动程序的基本服务.应用程序和数据库之间可以通过此类建立连接.常用的静态方法如下 static ...

  3. java连接mysql

    Java 连接 MySQL 需要驱动包,最新版下载地址为:http://dev.mysql.com/downloads/connector/j/,解压后得到jar库文件,然后在对应的项目中导入该库文件 ...

  4. java连接mysql数据库详细步骤解析

    java连接mysql数据库详细步骤解析      第一步:下载一个JDBC驱动包,例如我用的是:mysql-connector-java-5.1.17-bin.jar      第二步:导入下载的J ...

  5. java 连接 MySQL

    java 连接 MySQL 1.准备工作 需要下载的工具: MySQL:http://www.mysql.com/downloads/ MySQL的可视化工具SQLyog:https://www.we ...

  6. Java连接MySQL数据库及简单操作代码

    1.Java连接MySQL数据库 Java连接MySql需要下载JDBC驱动MySQL-connector-java-5.0.5.zip(举例,现有新版本).然后将其解压缩到任一目录.我是解压到D盘, ...

  7. 转载:Java连接MySQL 数据库的正确操作流程

    转载网址:http://www.bitscn.com/pdb/mysql/201005/186551.html       以下的文章主要介绍的是Java连接MySQL 数据库(以MySQL数据库为例 ...

  8. Java连接MySQL数据库增删改查通用方法

    版权声明:本文为博主原创文章,未经博主允许不得转载. Java连接MySQL数据库增删改查通用方法 运行环境:eclipse+MySQL 以前我们Java连接MySQL数据库都是一个数据库写一个类,类 ...

  9. Java 连接 MySQL 数据库

    最近想学习一下 Java 连接 MySQL 数据库,于是有了这样的一些问题&解决办法. 首先是解决 JDBC(Java Data Base Connectivity)驱动问题,因为默认安装的J ...

随机推荐

  1. ABP入门系列(6)——展现层实现增删改查

    这一章节将通过完善Controller.View.ViewModel,来实现展现层的增删改查.最终实现效果如下图: 一.定义Controller ABP对ASP.NET MVC Controllers ...

  2. HTML5-WebSocket技术学习(2)

    上一篇介绍了websocket的基本用法.这篇介绍websocket的一个框架: socket.io socket.io是一个既可以用在客户端又可以用在服务器端的框架. 本篇介绍socket.io在客 ...

  3. javascript中的array对象属性及方法

    Array 对象 Array 对象用于在单个的变量中存储多个值. 创建 Array 对象的语法: new Array(); new Array(size); new Array(element0, e ...

  4. jquery中的get和set

    jquery中通过参数的个数来判断是get方法还是set方法: css: function(name, value ) { return value !== undefined ? jQuery.st ...

  5. 在Centos5下安装GraphicsMagick

    安装GraphicsMagick的流水账: 安装参照的http://www.graphicsmagick.org/INSTALL-unix.html 解压 /home/milton/GraphicsM ...

  6. 序列化在Netty中的使用

    Java序列化的缺点 1.无法跨语言 对于Java序列化后的字节数组,别的语言无法进行反序列化 2.序列化后的码流过大 3.序列化性能低 使用JDK自带的序列化进行对象的传输 被传输的,实现了序列化接 ...

  7. Contains Duplicate II

    Given an array of integers and an integer k, find out whether there there are two distinct indices i ...

  8. C语言 生成随机数

    #include<stdio.h> #include<time.h> #include<Windows.h> void main1(){ //定义一个时间类型 ti ...

  9. C#基础系列:开发自己的窗体设计器(PropertyGrid显示中文属性名)

    既然是一个窗体设计器,那就应该能够设置控件的属性,设置属性最好的当然是PropertyGrid了,我们仅仅需要使用一个PropertyGrid.SelectedObject = Control就可以搞 ...

  10. Python自动化测试 (二) ConfigParser模块读写配置文件

    ConfigParser 是Python自带的模块, 用来读写配置文件, 用法及其简单. 直接上代码,不解释,不多说. 配置文件的格式是: []包含的叫section,    section 下有op ...