事务-Transaction

某些情况下我们希望对数据库的某一操作要么整体成功,要么整体失败,经典的例子就是支付宝提现。例如我们发起了支付宝到银行卡的100元提现申请,我们希望的结果是支付宝余额减少100元,银行卡余额增加100元,而不是支付宝的100元被扣除,而银行卡的100元却没收到。也就是说,要么100元从支付宝扣除的同时银行卡也会多出一百元,要么这次提现失败支付宝的100元还在,银行卡也没有收到钱。支付宝扣钱和银行卡收钱,这两件事要么都成功要么都失败。

事物的ACID特性:

满足ACID特性的操作,我们可以说它是一个事物。

  1. 原子性:该操作是最小逻辑单元整体,已经不可分隔。
  2. 一致性:要么所有都执行,要么所有都不执行。
  3. 隔离性:多个事务相互隔离,互不影响。
  4. 持久性:事物的执行结果永久生效。

对事物的控制:

在JDBC中可以调用Connection对象的setAutoCommit(false)这个接口,将commit()之前的所有操作都看成是一个事物。同时,如果事务执行过程中发生异常,可以调用rollback()接口进行回滚到事务开始之前的状态。

示例代码:

下面代码演示了将cjk的100元转账到ly的账户上:

package org.lyk.main;

import java.sql.Connection;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

import org.apache.commons.dbcp2.BasicDataSource;

public class Main

{

public static String DBDRIVER = "com.mysql.jdbc.Driver";

public static String DB_URL = "jdbc:mysql://localhost:3306/mldn";

public static String USERNAME = "root";

public static String PASSWORD = "admin";

public static BasicDataSource bds = null;

public static void main(String[] args)

{

dbPoolInit();

transferAmount();

System.out.println("///Done~~~");

}

public static void dbPoolInit()

{

bds = new BasicDataSource();

bds.setDriverClassName(DBDRIVER);

bds.setUrl(DB_URL);

bds.setUsername(USERNAME);

bds.setPassword(PASSWORD);

}

public static boolean transferAmount()

{

boolean retVal = true;

String sql = "UPDATE user SET amount=? WHERE userid=?";

Connection conn = null;

PreparedStatement stmt = null;

ResultSet rs = null;

try

{

conn = bds.getConnection();

conn.setAutoCommit(false);

stmt = conn.prepareStatement(sql);

stmt.setInt(1, 0);

stmt.setString(2, "cjk");

stmt.execute();

stmt.setInt(1, 100);

stmt.setString(2, "ly");

stmt.execute();

conn.commit();

} catch (SQLException e)

{

// TODO Auto-generated catch block

e.printStackTrace();

try

{

conn.rollback();

} catch (SQLException e1)

{

// TODO Auto-generated catch block

e1.printStackTrace();

}

}

finally

{

try

{

if(conn != null)

conn.close();

if(stmt != null)

stmt.close();

if(rs != null)

rs.close();

}

catch(Exception e)

{

//ignore all exceptions when closing...

}

}

return retVal;

}

}

事务断点(Savepoint):

某些时候,我们对一个事物操作失败,我们并不像回滚到最初状态,而是回滚到事务开始后的某一个地方,这时我们可以使用断点的方式让事物回滚到指定的断点(Savepoint)上.

示例代码:

下面的代码演示了如果cjk的100元转账到ly失败的话,我们将这100元转到cyx的账户上。(其中用手动跑出异常的方式模拟cjk到ly的转账失败)

package org.lyk.main;

import java.sql.Connection;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.sql.Savepoint;

import org.apache.commons.dbcp2.BasicDataSource;

public class Main

{

public static String DBDRIVER = "com.mysql.jdbc.Driver";

public static String DB_URL = "jdbc:mysql://localhost:3306/mldn";

public static String USERNAME = "root";

public static String PASSWORD = "admin";

public static BasicDataSource bds = null;

public static void main(String[] args)

{

dbPoolInit();

transferAmount();

System.out.println("///Done~~~");

}

public static void dbPoolInit()

{

bds = new BasicDataSource();

bds.setDriverClassName(DBDRIVER);

bds.setUrl(DB_URL);

bds.setUsername(USERNAME);

bds.setPassword(PASSWORD);

}

public static boolean transferAmount()

{

boolean retVal = true;

String sql = "UPDATE user SET amount=? WHERE userid=?";

Connection conn = null;

PreparedStatement stmt = null;

ResultSet rs = null;

Savepoint sp = null;

try

{

conn = bds.getConnection();

conn.setAutoCommit(false);

stmt = conn.prepareStatement(sql);

stmt.setInt(1, 0);

stmt.setString(2, "cjk");

stmt.execute();

sp = conn.setSavepoint();

stmt.setInt(1, 100);

stmt.setString(2, "ly");

stmt.execute();

throw new Exception();

}

catch (Exception e)

{

e.printStackTrace();

try

{

conn.rollback(sp);

stmt.setInt(1, 100);

stmt.setString(2, "cyx");

stmt.execute();

conn.commit();

} catch (SQLException e1)

{

// TODO Auto-generated catch block

e1.printStackTrace();

}

}

finally

{

try

{

if(conn != null)

conn.close();

if(stmt != null)

stmt.close();

if(rs != null)

rs.close();

}

catch(Exception e)

{

//ignore all exceptions when closing...

}

}

return retVal;

}

}

JDBC中的事务-Transaction的更多相关文章

  1. 一、DAO设计模式 二、DAO设计模式的优化 三、JDBC中的事务,连接池的使用

    一.DAO设计模式概述###<1>概念 DAO,Data Access Object ,用于访问数据库的对象. 位于业务逻辑和数据持久化层之间,实现对数据持久化层的访问![](1.png) ...

  2. JDBC中处理事务,小Demo

    事务的四大特性(ACID):  原子性(Atomicity):事务中所有操作是不可再分割的原子单位.事务中所有操作要么全部执行成功,要么全部执行失败.  一致性(Consistency):事务执行 ...

  3. JDBC 中的事务和批处理 batch

    JDBC事务处理: 事务处理一般在事务开始前把事务提交设置为false 所有DML语句执行完成后提交事务 demo: package com.xzlf.jdbc; import java.sql.Co ...

  4. JDBC中DAO事务函数模版

    DAO事物函数模版1: public void OrderFinsByPage(){ Connection conn = null; PreparedStatement pstmt = null; R ...

  5. day18 8.jdbc中设置事务隔离级别

    设置数据库事务隔离级别特殊需求才有,后面很少用.因为数据库本身是事务隔离级别的,mysql的事务隔离级别是Repeatable read,可以解决脏读和不可重复读.不用设置,人家数据库是有事务隔离级别 ...

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

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

  7. java中对事务的理解

    一.什么是事务 事务是访问数据库的一个操作序列,数据库应用系统通过事务集来完成对数据库的存取. 二.事务的原则(ACID) 原子性:事务要么全部都被执行,要么就全都不被执行,如果有子事务提交失败,那么 ...

  8. Java中的事务及使用

    什么是事务? 事务(Transaction),一般是指要做的或所做的事情.在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit).事务通常由高级数据库操纵语言或编程语言(如S ...

  9. JDBC&&c3p0、事务、批处理、多线程 于一体的经典秘方QueryRunner

    目录: 基础篇_功能各自回顾 JDBC基础代码回顾(使用JdbcUtils工具简化) c3p0数据库连接池的使用(使用JdbcUtils工具简化) 大数据的插入(使用c3p0+JdbcUtils工具简 ...

随机推荐

  1. EDIUS设置自定义输出的方法

    在做后期视频剪辑时,往往根据需求,需要输出不同分辨率格式的视频文件,那在EDIUS中,如何自定义输出设置,使之符合自己的需要呢?下面小编就来详细讲讲EDIUS自定义输出的一二事吧. 当剪辑完影片,设置 ...

  2. OCR是用来做什么的

    OCR(Optical Character Recognition,光学字符识别)是指电子设备(例如扫描仪或数码相机)检查纸上打印的字符,通过检测暗.亮的模式确定其形状,然后用字符识别方法将形状翻译成 ...

  3. 007. 自定义ListBox的item的宽高, 字体居中

    /// <summary> /// 自定义ListBox的item的宽高, 字体居中 /// </summary> /// <param name="sende ...

  4. Oracle数据库—— PL/SQL进阶编程

    一.涉及内容 1.掌握PL/SQL程序块的结构 2.理解并熟练掌握各种变量的应用. 二.具体操作 1.创建一个表messages,该表只有一个字段results 类型是number(2),编写一个块, ...

  5. Python命令行中输入pip提示不是内部或外部命令

    WIN764位,Python34 输入命令python -m pip

  6. 【转】object标签和embed标签

    我们现在大部分人做网页,都是直接用DW插入flash,而且DW也是所见即所得,直接生成了相应的flash显示代码.可是我们又有多少人了解这些直接由DW生成的代码呢?其实我接触flash player标 ...

  7. Struts2中s:set标签和s:if标签小结

    1.  s:set标签 格式:<s:set name="" value="" scope=””/> 说明:把jsp页面中的一个值,以name存储起来 ...

  8. tomcat如何按站点调试本机程序

    1.配置host host地址:c:\windows\system32\drivers\etc 配置本机域名: # localhost name resolution is handled withi ...

  9. junit类找不到的问题解决

    1. Class not found  *******java.lang.ClassNotFoundException: ******* at java.net.URLClassLoader$1.ru ...

  10. 未在本地计算机上注册“Microsoft.Jet.OLEDB.4.0

    昨天修改了一个工具,编译后本机运行正常,但放到服务器上执行却不行,提示: message:GetOleDbSchemaTable requires an open and available Conn ...