一 、事务的几个重要特性

1. 原子性

  事务内的每个内容不可分割,是一个统一的整体。或同时进行或同时消亡。

2.一致性

事务执行前和事务执行后,状态都是统一的。如A转B 100元,A和B数据总额度没有在这个转账过程中增加或者减小。

3.隔离性【isolation】

  事务的隔离性指的是几个事务同时执行,事务a不应该干扰到事务b内的操作(在并发过程中很有可能会发生事务间的影响,例如脏读、不可重复读等。需要在编程的时候选择适当的方式进行选择)

3.可持久性

  事务执行后的结果可以存储(序列化)到硬盘上,形成一个固定的内容存储起来。

二、事务的使用

  事务的生命周期有2个,1开启事务 2提交或者回滚事务。事务开始后一定要提交或者回滚,以免引起数据库内存泄漏

  使用Mysql开启事务及使用。

  表内数据如下,现需要从a账号转100money到b账号。

具体步骤如下:

  Mysql 中与事务使用有关的三个关键语句:

(1) 开启事务 : start transaction

(2)回滚事务 :rollback , 提交事务:commit

三、使用JDBC对事务进行调用

△注意: 事务只能对DML语句进行操作,对数据定义类语句DDL无法操作,例如建表、建立索引、建立分区等。

JDBC使用事务时,需要使用Java语言中的Connection对事务进行操作,具体的事务对应一个数据库连接。

 package com.scl.test.transcaction;

 import java.sql.Connection;
import java.sql.Statement; import org.junit.Test; public class TestTranscaction
{ @Test
public void testTransaction() throws Exception
{
Connection conn = null;
Statement statement = null; try
{
conn = JDBCHelper.getConnection(); conn.setAutoCommit(false); //开启事务,禁止自动提交
String sql1 = "update t_account t set t.money=t.money-100 where t.name ='a'";
String sql2 = "update t_account t set t.money=t.money+100 where t.name ='b'";
statement = conn.createStatement();
// statement.setString(1, "a"); statement.addBatch(sql1);
statement.addBatch(sql2); statement.executeBatch();
conn.commit(); //执行成功,提交事务 }
catch (Exception e)
{
conn.rollback(); //发生异常,事务回滚
}
finally
{
JDBCHelper.disposeConnect(statement, conn);
}
}
}

  最后进行一个知识点补漏:JDBC执行多条sql脚本。

  JDBC提供了执行多条sql语句的方法,使用PrepareStatement或Statement实例调用addBatch方法。目前发现该方法有几个缺点:

  1. 无法通过PrepareStatement实例对多条不同的sql脚本进行参数化设置。因为PrepareStatement是由一个链接产生的,不能同时用一个prepareStatement实例同时对应两个不同的预处理文件。

   如需求:需要插入更新一张表里面的两行不同的数据。

sql1: update t_account t set t.money=t.money-100 where t.name ='a';

   sql2: update t_account t set t.money=t.money-100 where t.name ='b';

   这时候没办法使用prepareStatement的addBatch方法执行操作。见代码:

     @Test
public void testTransaction() throws Exception
{
Connection conn = null;
Statement st = null;
PreparedStatement pst = null;
try
{
conn = JDBCHelper.getConnection(); conn.setAutoCommit(false);
String sql1 = "update t_account t set t.money=t.money-100 where t.name =?";
String sql2 = "update t_account t set t.money=t.money+100 where t.name =?";
pst = conn.prepareStatement(sql1);
// 只能批量执行某一条固定的sql语句,并且进行参数化设置
pst.setString(1, "a"); // 为name 为 a的用户减少100元
pst.addBatch();
pst.setString(1, "b"); // 为name 为b的用户减少100元
pst.addBatch();
pst.executeBatch(); // 只能在执行完成以后提交一次,然后改成新的sql脚本。但容易引发内存泄漏 pst = conn.prepareStatement(sql2); // 内存泄漏,存在未关闭的链接
pst.setString(1, "c");
pst.addBatch();
pst.executeBatch();
conn.commit(); }
catch (Exception e)
{
conn.rollback();
}
finally
{
JDBCHelper.disposeConnect(pst, conn);
}
}

2. 使用statement实例对多条脚本进行提交(只提交一次,但无法进行预编译sql脚本)

     @Test
public void testTransaction() throws Exception
{
Connection conn = null;
Statement st = null;
PreparedStatement pst = null;
try
{
conn = JDBCHelper.getConnection(); conn.setAutoCommit(false);
String sql1 = "update t_account t set t.money=t.money-100 where t.name =?";
String sql2 = "update t_account t set t.money=t.money+100 where t.name =?";
pst = conn.prepareStatement(sql1);
// 只能批量执行某一条固定的sql语句,并且进行参数化设置
pst.setString(1, "a"); // 为name 为 a的用户减少100元
pst.addBatch();
pst.setString(1, "b"); // 为name 为b的用户减少100元
pst.addBatch();
pst.executeBatch(); // 只能在执行完成以后提交一次,然后改成新的sql脚本。但容易引发内存泄漏 pst = conn.prepareStatement(sql2); // 内存泄漏,存在未关闭的链接
pst.setString(1, "c");
pst.addBatch();
pst.executeBatch();
conn.commit(); }
catch (Exception e)
{
conn.rollback();
}
finally
{
JDBCHelper.disposeConnect(pst, conn);
}
}

MySql事务及JDBC对事务的使用的更多相关文章

  1. JDBC处理事务

    一.什么是事务? 在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务! 二.事务是必须满足4个条件(AC ...

  2. JDBC、事务和连接池

    一:JDBC 1.什么是JDBC JDBC(Java Data Base Connectivity)SUN公司提供的一套操作数据库的标准规范.具体来讲是一种用于执行SQL语句的Java API,为多种 ...

  3. jdbc如何处理事务

    Connection提供了事务处理的方法,通过调用setAutoCommit(false)可以设置手动提交事务:当事务完成后用commit()显式提交事务:如果在事务处理过程中发生异常则通过rollb ...

  4. Mysql事务与JDBC事务管理

    一.事务概述 1.什么是事务 一件事情有n个组成单元 要不这n个组成单元同时成功 要不n个单元就同时失败 就是将n个组成单元放到一个事务中 2.mysql的事务 默认的事务:一条sql语句就是一个事务 ...

  5. MySql中的事务、JDBC事务、事务隔离级别

    一.MySql事务 之前在Oracle中已经学习过事务了,这个东西就是这个东西,但是在MySql中用法还是有一点不同,正好再次回顾一下. 先看看MySql中的事务,默认情况下,每执行一条SQL语句,都 ...

  6. 【Java EE 学习 52】【Spring学习第四天】【Spring与JDBC】【JdbcTemplate创建的三种方式】【Spring事务管理】【事务中使用dbutils则回滚失败!!!??】

    一.JDBC编程特点 静态代码+动态变量=JDBC编程. 静态代码:比如所有的数据库连接池 都实现了DataSource接口,都实现了Connection接口. 动态变量:用户名.密码.连接的数据库. ...

  7. 【JDBC】事务的使用

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/5868750.html 关于事务的理论知识.ACID特性等等,网上太多了,在此不一一重复.本文主要着重  事务 ...

  8. 事务之使用JDBC进行事务的操作2

    本篇将讲诉如何使用JDBC进行数据库有关事务的操作.在上一篇博客中已经介绍了事务的概念,和在MySQL命令行窗口进行开启事务,提交事务以及回滚事务的操作. 似乎事务和批处理都可以一次同时执行多条SQL ...

  9. JDBC控制事务

    概念 事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit).事务通常由高级数据库操纵语言或编程语言(如SQL,C++或Java)书写的用户程序的执行所引起,并 ...

随机推荐

  1. 二、FreeMarker 模版开发指南 第二章 数值和类型

    章节内容如下:   基本内容 类型 一.基本内容 简介 什么是数值? 什么是类型? 数据模型是哈希表 a.简介 理解数值和类型的概念是理解数据模型的关键所在.然而,数值和类型的概念并不局限于数据模型, ...

  2. 【新闻】超灵敏MRI技术:照亮人体肺部

    人口健康直接影响到一个国家的经济发展和社会进步.据我国2013年发布的肿瘤发病率统计年报表明,肺癌是我国目前首位恶性肿瘤,是癌症死亡的头号杀手,目前城市中每4名死亡的癌症患者中,约有1名是肺癌.如何开 ...

  3. Go2Shell

    1.背景 windows系统可以轻而易举地拿到文件所在目录, 但是mac显得想拿文件目录有点蛋疼.而Go2Shell可以快速定位到文件所在的目录. 2.安装配置 选择默认打开的终端软件 3.使用 进入 ...

  4. spring aop 的一个demo(未完,待完善)

    假设我们有这样的一个场景 : 对于一个类的众多方法,有些方法需要从缓存读取数据,有些则需要直接从数据库读取数据.怎样实现呢? 实现方案有多种.下面我说下常见的几种实现方案 : 1.直接采用spring ...

  5. CSDN首页> 移动开发 直接拿来用!最火的Android开源项目(完结篇)

    此前,CSDN移动频道推出的GitHub平台上“最受欢迎的开源项目”系列文章引发了许多读者的热议,在“直接拿来用!最火的Android开源项目”系列文章(一).(二)中,我们也相继盘点了40个GitH ...

  6. btrace拓展工具-java应用性能诊断优化利器

    Btrace是一个实时监控工具,可以无需修改应用代码(事实上它修改了字节码),来达到不可告人的秘密!这是性能调优和诊断的利器! 它可以获取应用程序代码的执行时间,他可以让你无需修改代码,帮你做时间的打 ...

  7. Http协议网络对时工具

    2009-09-17 11:52:31 专业的网络对时软件大多採用NTP协议来获取专业时间server时间对时,也有採用SNTP协议的,本来也想做个SNTP或NTP协议的对时工具自己用,尽管我手上也有 ...

  8. android自动填充短信验证码

    自动拦截短信实际上就是在系统注册一个BroadcastReceiver,然后通过设置拦截短信的: filter.addAction("android.provider.Telephony.S ...

  9. js hash字符串转成json

    var a='account.type=1&account.id=&account.dependFlag=0&account.card.companyId=1&acco ...

  10. Apache中 RewriteRule 规则参数介绍

    Apache中 RewriteRule 规则参数介绍 摘要: Apache模块 mod_rewrite 提供了一个基于正则表达式分析器的重写引擎来实时重写URL请求.它支持每个完整规则可以拥有不限数量 ...