JDBC高级篇(MYSQL)—— JDBC中初涉数据库事务
注意:其中的JdbcUtil是我自定义的连接工具类:代码例子链接:
package d_transaction;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import util.JdbcUtil;
/**
* 数据库事务:
* 比如银行转账:首先从一个账户扣除,再往另一个账户增加(update)
* 假如在扣除之后,添加的时候出现异常(断网,等等)
*
* 这个时候就需要数据库的事务功能;
* 数据库的事务功能,具体是指把转账看成一个事务,在转账的过程中,
* 要么所有操作一起完成,要么所有操作一起失败!
*
* 事务的原理:
* 把每一个操作记录下来;在出现异常的时候进行还原!
*
* mysql操作事务的命令:
* 1) 开启事务 set autocommit = 1/0;
* 0: 表示关闭自动提交事务,切换到手动提交事务,相当于开启事务。
* 1: 表示自动提交事务,每次执行完一次sql语句,都会提交一次事务(但是提交了之后不能回滚:恢复)
*
*
*
* commit:(提交事务)
* 一组sql语句操作成功之后,需要提交事务。
* 当事务中的所有操作执行成功之后,要提交事务,事务一旦提交,永久的
* 保存到数据库中,且不能回滚! commit;
*
* rollback:(回滚事务)
* 当事务中的任何一个操作出现问题,可以使用回滚命令,回滚到事务开启的点。
* rollback;
*
* 这里需要提到的是,之前在学习存储过程的时候
* 两个比较常用的全局变量:
* autocommit和character_set_results
* 其中 select @@autocommit; -- 就可以看到我们当前的事务是否自动,0手动
* 在命令行中,我们经常解析中文错误,因为我们设置的utf8
* 先使用 select @@character_set_results;
* 但是在cmd中是ASCII编码;所以我们要使用set @@character_set_result=gbk;
*
*
* 直接rollback; 就可以返回最初始的状态
* @author mzy
*
*/
public class Demo01 {
/**
* 模拟转账的过程:硬代码,固定转账金额
*/
public static void main(String[] args) {
Connection conn = null;
PreparedStatement stmt = null;
try {
conn = JdbcUtil.getConnection();
// 首先设置autocommit为0,手动的提交事务:false为0,1为true
conn.setAutoCommit(false);
// 准备转账的语句
/**
* 从mzy转账2000给jacky
*/
// 减去
String delSql = "update account set balance=balance-2000 where name='mzy'";
// 加上
String AddSql = "update account set balance=balance+2000 where name='jacky'";
stmt = conn.prepareStatement(delSql);
// 执行
stmt.executeUpdate();
// 模拟转账中出现异常
/**
* 出现异常之后,一方扣钱,但是另一方却是收不到付款。
*
* 这里就需要使用到数据库的事务:
* 事务的使用:一组sql,要么都执行,要么都不执行!
*/
// int i = 100/0;
// 上一次的,要先close,不然会内存泄漏
stmt.close();
stmt = conn.prepareStatement(AddSql);
stmt.executeUpdate();
// 转账成功之后进行commit,事务的提交操作
conn.commit();
System.out.println("转账成功!");
} catch (SQLException e) {
// 当业务中出现异常,任何一条sql执行传问题,都需要进行回滚
try {
conn.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
e.printStackTrace();
} finally {
JdbcUtil.close(stmt, conn);
}
}
}
/**
* 事务的四个特征(ACID):
* 1. 原子性:不可再分,要么一起成功,要么一起失败!
* 2. 一致性:在操作的前后,体量是不变的,守恒!
* 较难理解 3. 隔离性:多个事务并发,应该要相互隔离!(重点)
* 4. 持久性:一旦提交,改变必须是永久的!即使是数据库崩溃也是可恢复的!
*
* 对事务的隔离性的进一步理解:
* 如果事务并发可能产生的问题:
* 1) 脏读:
* 一个事务读到了另一个事务未提交的更新数据。
*
* 2) 不可重复读:
* 一个事务读到另一个事务已提交的更新数据。
*
* 3) 幻读:
* 一个事务读到了另一个事务新插入的数据。
*
*/
JDBC高级篇(MYSQL)—— JDBC中初涉数据库事务的更多相关文章
- Docker入门(四)——MySQL镜像中的数据库可视化
在详细介绍这篇文章的内容前,需要说明下笔者写这篇文章的意图:笔者在现有的开发中,前后端联调的方式为Docker镜像对接,数据库使用MySQL镜像,开发环境为远程服务器,因此,笔者迫切需要一种能将远 ...
- registered the JDBC driver [com.mysql.jdbc.Driver] but failed to unregister it when the web application was stopped.
最近在用maven整合SSH做个人主页时候,在eclipse里面使用tomcat7插件发布项目是没有问题的,但当打包成war之后,使用tomcat7单独发布项目,就出现了以下的错误. 严重: Cont ...
- 解决 01-Jul-2016 10:49:05.875 WARNING [localhost-startStop-2] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesJdbc The web application [ROOT] registered the JDBC driver [com.mysql.jdbc.D
01-Jul-2016 10:49:05.875 WARNING [localhost-startStop-2] org.apache.catalina.loader.WebappClassLoade ...
- 解决 Tomcat reload WARNING [localhost-startStop-2] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesJdbc The web application [] registered the JDBC driver [com.mysql.jdbc.Driver] but fail
转自:http://www.cnblogs.com/interdrp/p/5632529.html 我的错误如下: 06-Sep-2016 18:57:10.595 WARNING [localhos ...
- org.hibernate.service.classloading.spi.ClassLoadingException: Specified JDBC Driver com.mysql.jdbc.Driver class not found
今天在使用hibernate搭建开发环境的时候出现了一个不可思议的问题: org.hibernate.service.classloading.spi.ClassLoadingException: S ...
- registered the JDBC driver [com.mysql.jdbc.Driver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered.
问题是tomcat的版本问题,tomcat新检测机制导致的这个问题,换版本可以解决问题,但不建议这么做,租用服务器不是你说换就换的.其实问题根源是BasicDataSource,BasicDataSo ...
- MySQL高级篇 | MySQL逻辑架构
思维导图 架构逻辑视图 每个虚线框为一层,总共三层. 第一层:连接层,所包含的服务并不是MySQL所独有的技术.它们都是服务于C/S程序或者是这些程序所需要的 :连接处理,身份验证,安全性等等. 第二 ...
- 在Spring Boot中使用数据库事务
我们在前面已经分别介绍了如何在Spring Boot中使用JPA(初识在Spring Boot中使用JPA)以及如何在Spring Boot中输出REST资源(在Spring Boot中输出REST资 ...
- 理解MySQL(二)--数据库事务
1.事务:事务内的语句,要么全部执行成功,要么全部执行失败. a) 数据库事务四要素:ACID,原子性,一致性,隔离性,持久性. b) 原子性:一个事务必须被视为不可分割的最小单元 ...
随机推荐
- 前端开发入门到进阶第一集【使用sublime快速编写Html和Css】
1,安装sublime编辑器,下载地址:http://www.sublimetext.com/3 2,要使用sublime的插件机制必须安装package control:https://packag ...
- springMVC-7-数据处理转换
我们为什么要对数据进行处理? 需求:在上个crud中我们如果需要每次修改的时候都要把时间也记录下来 解决:在jsp中新增一个input,在employee中新增一个Data字段 问题:input输出来 ...
- 网络损伤仪WANsim的功能与型号
网络损伤仪简介 WANsim网络损伤仪是一款可以模拟真实的广域网状况的设备.它可以通过简单的数据填写模拟出时延.带宽抖动.丢包.乱序.误码.报文重复等网络状况. 大多数公司在进行产品测试时,只关注了应 ...
- springboot+mybatis+mysql 利用mybatis自动生成sql语句
工具和环境 idea,mysql,JDK1.8 效果图如下 结构图如下 java resources sql文件 /* Navicat MySQL Data Transfer Source Serve ...
- CSS样式实现表头和列固定
效果图:第一行和第一列固定 <!DOCTYPE html> <html lang="zh"> <head> <meta cha ...
- C++第四十三篇 -- VS2017创建控制台程序勾选MFC类库
用VS2017创建EXE带MFC类库方法 1. File --> New --> Project 2. Windows桌面向导 3. 勾选MFC类库 4. 创建成功 如果项目编译出错 1. ...
- [ZJOI2010]基站选址,线段树优化DP
G. base 基站选址 内存限制:128 MiB 时间限制:2000 ms 标准输入输出 题目类型:传统 评测方式:文本比较 题目描述 有N个村庄坐落在一条直线上,第i(i>1)个村庄距离 ...
- tensorflow踩坑合集2. TF Serving & gRPC 踩坑
这一章我们借着之前的NER的模型聊聊tensorflow serving,以及gRPC调用要注意的点.以下代码为了方便理解做了简化,完整代码详见Github-ChineseNER ,里面提供了训练好的 ...
- Android中的一些小细节
在代码中获取到的padding .margin.getWidth.event.getX.context.getResources().getDimensionPixelSize(R.dimen.key ...
- JS的FileSaver在Chrome上保存失败
在使用JavaSript的FileSaver保存文件时,IE11上好的,chrome上反没响应,不能保存文件.寻找了半天,最好发现是因为在FileSaver之外还有一个自定义的全局URL变量,把这个U ...