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) 原子性:一个事务必须被视为不可分割的最小单元 ...
随机推荐
- Python - 基础数据类型 list 列表
什么是列表 列表是一个有序的序列 列表中所有的元素放在 [ ] 中间,并用逗号分开 一个 列表 可以包含不同类型的元素,但通常使用时各个元素类型相同 特征 占用空间小,浪费内存空间少 声明列表变量 列 ...
- JAVA-Scaneer对象
Scanner对象 我们可以通过scanner来获取用户的输入 基本语法 Scanner s = new Scanner(System.in); nextLine():输入 import java.u ...
- Python - 可变和不可变对象
前置知识 在 Python 中,一切皆为对象 Python 中不存在值传递,一切传递的都是对象的引用,也可以认为是传址 有哪些可变对象,哪些不可变对象? 不可变对象:字符串.元组.数字(int.flo ...
- vsCode开发flutter项目
Visual Studio Code 安装: 下载链接:https://code.visualstudio.com/ 下载完成后根据步骤自行安装. 使用vsCode开发flutter项目需要部 ...
- 自动部署Springboot项目脚本小脚本
#!/bin/bash echo '自动部署Springboot项目脚本...' # aaa.jar 项目jar包 pid=`ps -ef|grep aaa.jar|grep -v grep|grep ...
- DC-8 靶机渗透测试
DC-8 渗透测试 冲冲冲 ,好好学习 . 核心:cms上传添加存在漏洞组件,利用该组件getshell 操作机:kali 172.66.66.129 靶机:DC-4 172.66.66.137 网络 ...
- NOIP&CSP PJ 难度刷题记录
前言 本来不想写前言的(>人<:) 这只是 mjl 给我们布置的作业,并不是我自己在刷题! 不保证所有代码的正确性,它们仅仅是通过了所有数据点而已. 1.模拟板块 整体难度:红~黄(模拟不 ...
- HttpRunner3源码阅读:7.响应后处理 response.py
response 上一篇说的client.py来发送请求,这里就来看另一个response.py,该文件主要是完成测试断言方法 可用资料 jmespath[json数据取值处理]: https://g ...
- Java 日志框架概述(slf4j / log4j / JUL / Common-logging(JCL) / logback)
一.简介 JAVA日志在初期可能官方并没有提供很好且实用的规范,导致各公司或OSS作者选择自行造轮子,这也导致了目前初学者觉得市面上 Java 日志库繁杂的局面. 现在市面流行以 slf4j(Simp ...
- 爱了,字节跳动大神最佳整理:582页Android NDK七大模块学习宝典,理论与实践
前言 时至今日,短视频App可谓是如日中天,一片兴兴向荣.随着短视频的兴起,音视频开发也越来越受到重视,而且薪资水涨船高,以一线城市为例,音视频工程开发的薪资比Android应用层开发高出40%. 但 ...