事务的四大特性(ACID):


原子性(Atomicity):
事务中所有操作是不可再分割的原子单位。事务中所有操作要么全部执行成功,要么全部执行失败。

一致性(Consistency):事务执行后,数据库状态与其它业务规则保持一致。如转账业务,无论事务执行成功与否,参与转账的两个账号余额之和应该是不变的。

隔离性(Isolation):隔离性是指在并发操作中,不同事务之间应该隔离开来,使每个并发中的事务不会相互干扰。

持久性(Durability):一旦事务提交成功,事务中所有的数据操作都必须被持久化到数据库中,即使提交事务后,数据库马上崩溃,在数据库重启时,也必须能保证通过某种机制恢复数据。

在默认情况下,每执行一条SQL语句,都是一个单独的事务。如果需要在一个事务中包含多条SQL语句,那么需要开启事务和结束事务。

开启事务:start transaction;

 结束事务:commit或rollback。



      在执行SQL语句之前,先执行strat transaction,这就开启了一个事务(事务的起点),然后可以去执行多条SQL语句,最后要结束事务,commit表示提交,即事务中的多条SQL语句所做出的影响会持久化到数据库中。或者rollback,表示回滚,即回滚到事务的起点,之前做的所有操作都被撤消了!

Connection的三个方法与事务相关:

(1) setAutoCommit(boolean):设置是否为自动提交事务,如果true(默认值就是true)表示自动提交,也就是每条执行的SQL语句都是一个单独的事务。

如果设置false,那么就相当于开启了事务了;con.setAutoCommit(false)表示开启事务。

(2) commit():提交结束事务;con.commit();表示提交事务。

(3) rollback():回滚结束事务。con.rollback();表示回滚事务。

jdbc处理事务的代码格式:

try {
con.setAutoCommit(false);//开启事务…
….

con.commit();//try的最后提交事务
} catch() {
con.rollback();//回滚事务
}

首先做一些准备工作:

(1)配置数据源,确定使用的数据库。详细信息见http://blog.csdn.net/qq_25827845/article/details/50836362

(2)在数据库中建立表account,并且插入数据

create table account
(
id int,
balance int,
)
select * from account
insert into account values (1,1000)
insert into account values (2,1000)

如图所示:

在程序中,首先是程序没有发生异常,则,转账成功。

当程序发生异常时,查询数据库,则会发现转账操作并没有完成。符合ACID特性。

Demo代码展示:

package com.ywq;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException; public class Dao {
/**
* 修改指定用户的余额!
* @param ct
* @param id
* @param balance
*/ //同一事务中必须使用同一个Connection对象,所以此处的Connection对象由调用处传入。
public void updateBalance(Connection ct,int id,int balance){ try {
String sql="update account set balance=balance+? where id=?";
PreparedStatement pt=ct.prepareStatement(sql); pt.setInt(1, balance);
pt.setInt(2, id); pt.executeUpdate(); } catch (SQLException e) { throw new RuntimeException(e);
} } }
package com.ywq;

import java.sql.*;

public class Demo {

	public static void main(String[] args) {
zhuanZhang(1, 2, 100); } public static void zhuanZhang(int from, int to, int money) {
// 对事务的操作必须使用Connection对象!
Connection ct = null;
try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
ct=DriverManager.getConnection("jdbc:odbc:ywq");
System.out.println(ct); //开启事务
ct.setAutoCommit(false); Dao dao = new Dao();
dao.updateBalance(ct, from, -money);//给from减去相应金额 if(true) {
//把此处的if语句块注释掉,则转账成功 throw new RuntimeException("不好意思,此处发生了异常,但是转账操作进行了一半,请观察结果");
} dao.updateBalance(ct, to, money);//给to加上相应金额 //提交事务
ct.commit();
ct.close();
} catch(Exception e) {
//回滚事务
try {
ct.rollback();
ct.close();
} catch (SQLException e1) {
}
throw new RuntimeException(e);
}
} }

JDBC中处理事务,小Demo的更多相关文章

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

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

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

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

  3. JDBC中的事务-Transaction

    事务-Transaction 某些情况下我们希望对数据库的某一操作要么整体成功,要么整体失败,经典的例子就是支付宝提现.例如我们发起了支付宝到银行卡的100元提现申请,我们希望的结果是支付宝余额减少1 ...

  4. JDBC中DAO事务函数模版

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

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

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

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

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

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

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

  8. 创建JDBC模板简化代码、JDBC应用的事务管理以及连接池的作用

    一.创建JDBC模板简化代码 一个简单的查询.要做这么一大堆事情,并且还要处理异常,我们不防来梳理一下: 1.获取connection  2.获取statement  3.获取resultset  4 ...

  9. java中对事务的理解

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

随机推荐

  1. QuantLib 金融计算——QuantLib 入门

    目录 QuantLib 金融计算--QuantLib 入门 简介 主要功能 安装与使用 学习指南 The HARD Way The EASY Way QuantLib 金融计算--QuantLib 入 ...

  2. pyserial timeout=1 || timeout=0.01

    昨天在做串口通信时候发现,串口参数(timeout=1 || timeout=0.01)对通信的读数据竟然影响很大,代码如下: self.ser = serial.Serial(port=serial ...

  3. C# openfiledialog的使用

    文件对话框(FileDialog) 一.打开文件对话框(OpenFileDialog) 1. OpenFileDialog控件有以下基本属性 InitialDirectory 对话框的初始目录Filt ...

  4. git提交代码到远程仓库

    1.仓库初始化 git init 2.连接仓库 git remote add origin 仓库地址 3.查看状态 git status 4.将文件添加到暂存区 git add 状态里的新文件 5.将 ...

  5. transform旋转变换效果

    div{ transform:rotate(7deg); -ms-transform:rotate(7deg); /* IE 9 */ -moz-transform:rotate(7deg); /* ...

  6. 在Linux上创建webrev(cont)[基于svn]

    在前文中,基于git介绍了webrev工具.实际上,webrev工具还支持hg和svn.最近的工作中不可避免地要使用svn,故在此总结一下如何基于svn在Linux上创建webrev.顺便吐个槽,没有 ...

  7. vue中添加Echarts图表的使用,Echarts的学习笔记

    项目中需要使用一些折线图.柱状图.饼状图等等,之前使用过heightCharts(关于heightCharts请看我的另一篇 http://www.cnblogs.com/jasonwang2y60/ ...

  8. Windows远程协助相关汇总

    正常情况下要勾选一个 复选框 ,再确保三个服务启动 https://jingyan.baidu.com/article/ca00d56c4c62bce99febcf11.html https://ji ...

  9. JavaScript插入节点小结

    JS原生API插入节点的方式大致有innerHTML.outerHTML.appendChild.insertBefore.insertAdjacentHTML.applyElement这6种. 这里 ...

  10. [转]Support Composite Key in ASP.NET Web API OData

    本文转自:https://code.msdn.microsoft.com/Support-Composite-Key-in-d1d53161 he default EntitySetControlle ...