MySql事务及JDBC对事务的使用
一 、事务的几个重要特性
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对事务的使用的更多相关文章
- JDBC处理事务
一.什么是事务? 在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务! 二.事务是必须满足4个条件(AC ...
- JDBC、事务和连接池
一:JDBC 1.什么是JDBC JDBC(Java Data Base Connectivity)SUN公司提供的一套操作数据库的标准规范.具体来讲是一种用于执行SQL语句的Java API,为多种 ...
- jdbc如何处理事务
Connection提供了事务处理的方法,通过调用setAutoCommit(false)可以设置手动提交事务:当事务完成后用commit()显式提交事务:如果在事务处理过程中发生异常则通过rollb ...
- Mysql事务与JDBC事务管理
一.事务概述 1.什么是事务 一件事情有n个组成单元 要不这n个组成单元同时成功 要不n个单元就同时失败 就是将n个组成单元放到一个事务中 2.mysql的事务 默认的事务:一条sql语句就是一个事务 ...
- MySql中的事务、JDBC事务、事务隔离级别
一.MySql事务 之前在Oracle中已经学习过事务了,这个东西就是这个东西,但是在MySql中用法还是有一点不同,正好再次回顾一下. 先看看MySql中的事务,默认情况下,每执行一条SQL语句,都 ...
- 【Java EE 学习 52】【Spring学习第四天】【Spring与JDBC】【JdbcTemplate创建的三种方式】【Spring事务管理】【事务中使用dbutils则回滚失败!!!??】
一.JDBC编程特点 静态代码+动态变量=JDBC编程. 静态代码:比如所有的数据库连接池 都实现了DataSource接口,都实现了Connection接口. 动态变量:用户名.密码.连接的数据库. ...
- 【JDBC】事务的使用
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/5868750.html 关于事务的理论知识.ACID特性等等,网上太多了,在此不一一重复.本文主要着重 事务 ...
- 事务之使用JDBC进行事务的操作2
本篇将讲诉如何使用JDBC进行数据库有关事务的操作.在上一篇博客中已经介绍了事务的概念,和在MySQL命令行窗口进行开启事务,提交事务以及回滚事务的操作. 似乎事务和批处理都可以一次同时执行多条SQL ...
- JDBC控制事务
概念 事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit).事务通常由高级数据库操纵语言或编程语言(如SQL,C++或Java)书写的用户程序的执行所引起,并 ...
随机推荐
- MSSQLSERVER数据库- 慎用SELECT INTO复制表
很多时候我们习惯于用SELECT INTO复制一个表或表结构,因为它方便,快捷,而且在某些情况下效率比INSERT INTO 效率要高一些.但是要注意: SELECT INTO 复制表或表结构的时候, ...
- NSThead
每个iOS应用程序都有个专门用来更新显示UI界面.处理用户的触摸事件的主线程,因此不能将其他太耗时的操作放在主线程中执行,不然会造成主线程堵塞(出现卡机现象),带来极坏的用户体验.一般的解决方案就是将 ...
- STL 源代码剖析 算法 stl_algo.h -- lower_bound
本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie lower_bound(应用于有序区间) ------------------------- ...
- Codeforces Round #322 (Div. 2) C. Developing Skills 优先队列
C. Developing Skills Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/581/p ...
- [Sciter系列] MFC下的Sciter–1.创建工程框架
Sciter SDK中提供的Win32下例程很多,唯独使用很多(对我个人而言)的MFC框架下Sciter程序的构建讲的很少,虽然MFC有这样那样的诟病,但是不可否认的是编写一般的小项目,这仍然是大 ...
- MFC——从实现角度分析微云界面
在云计算时代之风吹来,很多互联网公司都在建云,提出云盘.云储存.云平台.云空间等等,骤然间,天下皆云.云是啥?有用户量,就有云,没有用户量,你的系统,你的云,也就是一朵白云. 最近研究了下微云的界面, ...
- 转--23种设计模式的搞笑解释(后续放逐一C++解释版本)
创建型模式 1.FACTORY —追MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西,虽然口味有所不同,但不管你带MM去麦当劳或肯德基,只管向服务员说“来四个鸡翅”就行了.麦当劳和肯德 ...
- java_spring_bean的作用域_实例是否为单实例
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...
- zTree 异步加载
zTree异步加载数据的简单实现,更为详细的Api请参考 zTree官网 http://www.treejs.cn/ <link href="~/Content/ztree/css ...
- ios存储 plist 偏好设置 自定义对象存储
1,plist Plist注意:不能存储自定义对象 Plist:数组和字典, 如何判断一个对象能不能使用Plist,就看下有没有writeToFile 获取应用的文件夹(应用沙盒) NSString ...