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) 原子性:一个事务必须被视为不可分割的最小单元 ...
随机推荐
- deepin安装Motrix,cocomusic
1,motrix(下载工具):https://motrix.app/ 2,cocomusic(开源音乐播放器):https://github.com/xtuJSer/CoCoMusic/release ...
- 微信小程序云开发-云函数-云函数获取参数并实现运算
1.编写加法运算的云函数addData 2.在本地小程序页面调用云函数
- 在Vue中echarts可视化组件的使用
echarts组件官网地址:https://echarts.apache.org/examples/zh/index.html 1.找到脚手架项目所在地址,执行cnpm install echarts ...
- mybatis的增删改查返回值小析(六)
本文验证了通过mybatis访问数据库时的,增删改查的返回值情况. 直接看代码. 1.service层 /** *@Author: Administrator on 2020/3/12 15:15 * ...
- linux删除命令
Linux下的命令,删除文件夹下的所有文件,而不删除文件夹本身rm -rf *
- 用activiti实现类似钉钉审批流程-附整个系统源码
前言 目前市场上有很多开源平台没有整合工作流,即使有,也是价格不菲的商业版,来看这篇文章的估计也了解了行情,肯定不便宜.我这个快速开发平台在系统基础功能(用户管理,部门管理-)上整合了工作流,你可以直 ...
- jvm源码解读--17 Java的wait()、notify()学习
write and debug by 张艳涛 wait()和notify()的通常用法 A线程取得锁,执行wait(),释放锁; B线程取得锁,完成业务后执行notify(),再释放锁; B线程释放锁 ...
- videojs文档翻译-api
直播流地址 rtmp://live.hkstv.hk.lxdns.com/live/hks API 接口 (一) Modules 模块 1) browser :浏览器 2) ...
- .net 知新:【3】.net 5 项目结构说明和发布部署
.net 5的项目目录结构和.net framework有些明显的变化,包括显示结构和项目文件,从这两个方面看看有哪些变化. 项目目录结构 就以上篇用的demo项目为例([.net 知新:[2] .N ...
- Python的round()函数与数学的四舍五入的区别
print(round(0.5))>>0print(round(1.5))>>2print(round(2.5))>>2整数部分为偶 小数为0.5 向下取整 0也是 ...