注意:其中的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. P7362 [eJOI 2020 Day2] XOR Sort

    P7362 [eJOI 2020 Day2] XOR Sort 题意 给你一个长度为 \(n\) 的序列,每次操作可以将一个数异或上相邻的一个数,求将序列改为严格单调递增序列或严格单调不降序列的操作次 ...

  2. Python基础之实现界面和代码分离

    第一步:用QT Designer画一个TreeWidget,存为treeview4.ui,这个处理前面TreeWidget那一节讲过,这里不细讲 treeview4.py # -*- coding: ...

  3. (python函数03)zip()函数

    (python函数03)zip()函数 zip是用来压缩的,它接受一系列可迭代的对象作为参数,将对象中对应的元素打包成一个个元组(tuple),然后返回有这些tuples组成的对象,可强制转化为列表和 ...

  4. VUE-router-跳转

    跳转的 // 字符串 this.$router.push('/home/first') // 对象 this.$router.push({ path: '/home/first' }) // 命名的路 ...

  5. APICloud的真机wifi连接问题

    APICloud的真机wifi连接问题 在APICloud的真机wifi连接时需要注意事项与解决问题. 1.首先将项目拉取到本地,用APICloud Studio 2打开(也可以用webStorm配置 ...

  6. Elasticsearch(9300、9200)未授权访问

    下载地址https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.5.0.zip 检测 http://localhost ...

  7. Rancher监控指标一文干到底

    一.工作负载指标 直接截取一个生产环境的rancher的web管理端-工作负载指标模块的图(这里没有汉化,直接英文)如下: 共5个大指标: CPU使用 内存使用 网络包 网络IO 磁盘IO 自学入口: ...

  8. noip模拟30[毛毛毛探探探]

    \(noip模拟30\;solutions\) 所以说,这次被初中的大神给爆了????? 其实真的不甘心,这次考场上的遗憾太多,浪费的时间过多,心情非常不好 用这篇题解来结束这场让人伤心的考试吧 \( ...

  9. (原创)[.Net] 进程间通信框架(基于共享内存)——SimpleMMF

    一.前言 进程间通信技术的应用非常广泛,在Windows下常用的实现方式有:管道.Socket.消息.本地文件.共享内存等,每种方式都有各自适应的场景. 在进行大数据交换时,最优的方式便是共享内存. ...

  10. @Value(value="${***.***}")配置文件赋值给static静态变量

    public static String topicName; @Value("${activemq.topicName}") public void setTopicName(S ...