注意:其中的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中初涉数据库事务的更多相关文章

  1. Docker入门(四)——MySQL镜像中的数据库可视化

      在详细介绍这篇文章的内容前,需要说明下笔者写这篇文章的意图:笔者在现有的开发中,前后端联调的方式为Docker镜像对接,数据库使用MySQL镜像,开发环境为远程服务器,因此,笔者迫切需要一种能将远 ...

  2. 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 ...

  3. 解决 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 ...

  4. 解决 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 ...

  5. org.hibernate.service.classloading.spi.ClassLoadingException: Specified JDBC Driver com.mysql.jdbc.Driver class not found

    今天在使用hibernate搭建开发环境的时候出现了一个不可思议的问题: org.hibernate.service.classloading.spi.ClassLoadingException: S ...

  6. 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 ...

  7. MySQL高级篇 | MySQL逻辑架构

    思维导图 架构逻辑视图 每个虚线框为一层,总共三层. 第一层:连接层,所包含的服务并不是MySQL所独有的技术.它们都是服务于C/S程序或者是这些程序所需要的 :连接处理,身份验证,安全性等等. 第二 ...

  8. 在Spring Boot中使用数据库事务

    我们在前面已经分别介绍了如何在Spring Boot中使用JPA(初识在Spring Boot中使用JPA)以及如何在Spring Boot中输出REST资源(在Spring Boot中输出REST资 ...

  9. 理解MySQL(二)--数据库事务

    1.事务:事务内的语句,要么全部执行成功,要么全部执行失败. a)      数据库事务四要素:ACID,原子性,一致性,隔离性,持久性. b)      原子性:一个事务必须被视为不可分割的最小单元 ...

随机推荐

  1. Spring总结之IOC

    一.Spring IOC 简介 IOC(Inverse of control):控制反转,又称作依赖注入,主要是把创建对象和查找依赖对象的控制权交给IOC容器,由IOC容器管理对象的生命周期,是一种重 ...

  2. 用Nextcloud在树莓派上布置你的个人网盘“NAS”

    用Nextcloud在树莓派上布置你的个人网盘"NAS" 这次用的是目前最新的 Raspbian Stretch 系统,基于 Debian 9. 软件程序是 Nextcloud 1 ...

  3. VM虚拟机桥接模式无法联网、NAT模式能正常联网

    桥接模式:使虚拟机客户机可以和主机在同一网段,这样,和主机同局域网内的其他主机就也可以ping到虚拟机了: 因此,虚拟机设置为桥接模式,这样以后就可以方便的使用虚拟机了: 有时,虚拟机为桥接模式上不了 ...

  4. 【动态规划】合唱队形 luogu-

    分析 做两遍最长上升子序列,在遍历一下,取最大值. AC代码 #include <bits/stdc++.h> using namespace std; #define ms(a,b) m ...

  5. Deepin 20.1打造软件开发环境

    支持国产操作系统,替代Windows势在必行,不能让美国卡"脖子"是广大计算机爱好者的共同心愿,下面列举一下Deepin V20.1下如何安装常用软件 ============== ...

  6. Python基础之创建文件夹与删除文件夹。

    参考链接:https://blog.csdn.net/weixin_43826242/article/details/87101436 创建目录结构 # 创建文件目录结构 def create_fol ...

  7. 第十二篇 -- 关于U盘制作启动盘后在本机上显示不出来的解决方案

    喜欢玩电脑的朋友应该都重装过系统,最常用的就是用U盘装系统.以前装系统都没问题,不过偶然一次发现了一个问题,就是那个被制作成启动盘的U盘,插在本机上只能显示EFI启动文件部分,而其他空间全都显示不出来 ...

  8. 第九篇 -- cpu的学习

    CPU的核数关系: 总核数 = 物理CPU个数 X 每颗物理CPU的核数 总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU的核数 X 超线程数 Linux中查看CPU数: # 查看物理CPU个数 ...

  9. SpringMVC 参数中接收之一 List

    作者:张艳涛 time:2020-07-31 SpingMVC 一.前台传数组,SpingMVC用addusers(@RequestBody List<UserPojo> userlist ...

  10. 媒体应用视频超分AI神器!360P视频一键转换HD

    作为多媒体应用的开发者,你是否想为媒体播放器快速开发创新AI功能?例如: 在播放低画质视频过程中对其进行逐帧超分 让满屏飘飞的弹幕自动绕过画面的主体人物 HMS Core 6.0.0开放的多媒体管线服 ...