java-transaction事件

/*
########事务&数据库连接池&DBUtils

######事务

> Transaction 其实指的一组操作,里面包含许多个单一的逻辑。
只要有一个逻辑没有执行成功,那么都算失败。 所有的数据都回归到最初的状态(回滚)

####为什么要有事务?
> 为了确保逻辑的成功。 例子: 银行的转账。

 

 


###使用命令行方式演示事务。

* 开启事务
start transaction;
* 提交或者回滚事务
commit; 提交事务, 数据将会写到磁盘上的数据库
rollback ; 数据回滚,回到最初的状态。

1. 关闭自动提交功能。



2. 演示事务

 

#####使用代码方式演示事务

> 代码里面的事务,主要是针对连接来的。
>
>
> 1. 通过conn.setAutoCommit(false )来关闭自动提交的设置。

> 2. 提交事务 conn.commit();

> 3. 回滚事务 conn.rollback();
//注意当数据库不支持回滚的时候有如下原因
* 1.数据库引擎不是innodb 而是myisam,不支持事务回滚。
* 2.在rollback之前 已经通过connection.commit 提交改动 无法回滚
* 3.mysql默认create drop alter 等涉及到表修改,会隐式结束当前会话中的任何活动事务,直接提交,无法回滚。

@Test
public void testTransaction(){

Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
conn = JDBCUtil.getConn();

//连接,事务默认就是自动提交的。 关闭自动提交。
conn.setAutoCommit(false);

String sql = "update account set money = money - ? where id = ?";
ps = conn.prepareStatement(sql);

//扣钱, 扣ID为1 的100块钱
ps.setInt(1, 100);
ps.setInt(2, 1);
ps.executeUpdate();


int a = 10 /0 ;

//加钱, 给ID为2 加100块钱
ps.setInt(1, -100);
ps.setInt(2, 2);
ps.executeUpdate();

//成功: 提交事务。
conn.commit();

} catch (SQLException e) {
try {
//事变: 回滚事务
conn.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
e.printStackTrace();

}finally {
JDBCUtil.release(conn, ps, rs);
}
}

###事务的特性

* 原子性
> 指的是 事务中包含的逻辑,不可分割。

* 一致性
> 指的是 事务执行前后。数据完整性

* 隔离性
> 指的是 事务在执行期间不应该受到其他事务的影响

* 持久性
> 指的是 事务执行成功,那么数据应该持久保存到磁盘上。


###事务的安全隐患
> 不考虑隔离级别设置,那么会出现以下问题。

* 读
> 脏读 不可重读读 幻读.
* 脏读
> 一个事务读到另外一个事务还未提交的数据

* 不可重复读
> 一个事务读到了另外一个事务提交的数据 ,造成了前后两次查询结果不一致。


####读未提交 演示
1. 设置A窗口的隔离级别为 读未提交

2. 两个窗口都分别开启事务

* 写
> 丢失更新

 

#### 读已提交演示
1. 设置A窗口的隔离级别为 读已提交

2. A B 两个窗口都开启事务, 在B窗口执行更新操作。

3. 在A窗口执行的查询结果不一致。 一次是在B窗口提交事务之前,一次是在B窗口提交事务之后。

> 这个隔离级别能够屏蔽 脏读的现象, 但是引发了另一个问题 ,不可重复读。


###可串行化
> 如果有一个连接的隔离级别设置为了串行化 ,那么谁先打开了事务, 谁就有了先执行的权利, 谁后打开事务,谁就只能得着,等前面的那个事务,提交或者回滚后,才能执行。 但是这种隔离级别一般比较少用。 容易造成性能上的问题。 效率比较低。

* 按效率划分,从高到低
> 读未提交 > 读已提交 > 可重复读 > 可串行化

* 按拦截程度 ,从高到底
> 可串行化 > 可重复读 > 读已提交 > 读未提交


##事务总结

###需要掌握的
1. 在代码里面会使用事务
conn.setAutoCommit(false);
conn.commit();
conn.rollback();

2. 事务只是针对连接连接对象,如果再开一个连接对象,那么那是默认的提交。

3. 事务是会自动提交的。


###需要了解的

####安全隐患

脏读
一个事务读到了另一个事务未提交的数据
不可重复读
一个事务读到了另一个事务已提交的数据,造成前后两次查询结果不一致
幻读
一个事务读到了另一个事务insert的数据 ,造成前后查询结果不一致 。


丢失更新。

####隔离级别

读未提交
> 引发问题: 脏读

读已提交
> 解决: 脏读 , 引发: 不可重复读

可重复读
> 解决: 脏读 、 不可重复读 , 未解决: 幻读

可串行化
> 解决: 脏读、 不可重复读 、 幻读。

mySql 默认的隔离级别是 可重复读
Oracle 默认的隔离级别是 读已提交


###丢失更新


###解决丢失更新
* 悲观锁

> 可以在查询的时候,加入 for update
数据库的锁的机制,排他锁

* 乐观锁
> 要求程序员自己控制。


select @@tx_isolation查看现在的隔离级别(数据库)
set session transaction isolation level read XXX;修改隔离等级(数据库)
XXXX参数:uncommitted 读未提交
committed 读已经提交
read 重复度
serializable 可串行化
*/

 

数据库连接代码:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;public class ConnLink {
//数据库的连接部分public String jdbc_driver="com.mysql.jdbc.Driver";public String jdbc_conn="jdbc:mysql://localhost:3306/test";public String user="root";public String pass="root";//返回连接函数的部分public Connection getConn() throws SQLException, ClassNotFoundException{//1.注册驱动
        Class.forName(jdbc_driver);//2.获取连接Connection connection=DriverManager.getConnection(jdbc_conn,user,pass);return connection;}//释放连接资源的部分public void relese(Connection conn,PreparedStatement pstmt) throws SQLException{if(pstmt!=null) pstmt.close();if(conn!=null) conn.close();}
}

 

 

演示代码:

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.servlet.jsp.tagext.TryCatchFinally;public class Transaction {static ConnLink connlink=new ConnLink();public static void main(String[] args) throws SQLException, ClassNotFoundException {Connection conn=null;PreparedStatement pstmt=null; try {//获取数据库的连接conn=connlink.getConn();//连接,事务默认就是自动提交的。 关闭自动提交。conn.setAutoCommit(false);//创建执行sql语句的对象3 书写sql语句;String sqlString="update blank set money = money - ? where id = ?";//创建预处理对象pstmt = conn.prepareStatement(sqlString);//设置参数占位符pstmt.setInt(1, 100);pstmt.setInt(2,1); //执行语句
             pstmt.executeUpdate();//以上部分是给用户1扣100元,我们可以理解是用户1给用户2转账100元。所以下面要给用户2增加100元//在此处设置一个错误,促使数据库的事件回滚int a=10/0;String sqlString2="update blank set money = money +  ? where id = ?";pstmt = conn.prepareStatement(sqlString2);pstmt.setInt(1, 100);pstmt.setInt(2,2); pstmt.executeUpdate();//由于上面的conn.setAutoCommit(false);设置成了flase所以此处需要用commit()进行提交
             conn.commit();} catch (SQLException e) {// TODO: handle exception//这里是出现意外的情况就是转账失败,那么怎么办呢,直接取消所有的操作,实现数据库的回滚。
                conn.rollback();e.printStackTrace();}finally{connlink.relese(conn, pstmt);}}
}

 

转载于:https://www.cnblogs.com/byczyz/p/11343280.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/386206.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

阿里P8亲自讲解!java实例变量和类变量

前言 Spring如何解决的循环依赖,是近两年流行起来的一道Java面试题。其实笔者本人对这类框架源码题还是持一定的怀疑态度的。如果笔者作为面试官,可能会问一些诸如“如果注入的属性为null,你会从哪几个方向去排查”这些场景题。那么既然写了…

阿里P8亲自讲解!成功入职头条月薪35K

前言 又到一年金九银十之际。 Java作为目前用户最多,使用范围最广的软件开发技术之一。 Java的技术体系主要由支撑Java程序运行的虚拟机,提供各开发领域接口支持的Java,Java编程语言及许多第三方Jvav框架构成。 其中,以Java的虚拟器为今天的着…

java----连接池C3p0使用的补充

C3p0数据库的连接方式是目前市场场最为广泛的类型之一 本篇主要你演示C3p0使用文件配置和不使用文件配置的两种操作方式 #######使用文件配置 import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException;import com.dbutil.zyz.ConnLink; …

阿里P8大佬亲自教你!java程序设计第四版pdf

前言 最近有很多朋友去目前主流的大型互联网公司面试(阿里巴巴、京东、字节跳动、蚂蚁金服、滴滴),面试回来之后会发给我一些面试题。有些朋友轻松过关,拿到offer,但是有一些是来询问我答案的。 我特意整理了一下&am…

阿里P8大佬亲自讲解!朝阳java培训

开头 Spring框架自诞生以来一直备受开发者青睐,有人亲切的称之为:Spring 全家桶。Spring更是避免了重复造轮子的工作并跟随着互联网行业的发展做出不断的更新,很多研发人员把spring看作心目中最好的Java项目,没有之一。 **可以毫…

大厂offer手到擒来,Java面试真题精选

前言 事务我们都知道是什么,而Spring事务就是在数据库之上利用AOP提供声明式事务和编程式事务帮助我们简化开发,解耦业务逻辑和系统逻辑。但是Spring事务原理是怎样?事务在方法间是如何传播的?为什么有时候事务会失效&#xff1f…

大厂也在用的6种数据脱敏方案,醍醐灌顶!

前言 由于作者面试过程中高度紧张,本文中只列出了自己还记得的部分题目。 经历了漫长一个月的等待,终于在前几天通过面试官获悉已被蚂蚁金服录取,这期间的焦虑、痛苦自不必说,知道被录取的那一刻,一整年的阴霾都一扫…

大牛带你直击优秀开源框架灵魂,给大家安排上!

前言 微架构的出现,很好地适应了这个时代对快速发展变化的要求。它不再提倡一体化的项目设计,而是对项目进行有效的“业务区”(可以简单理解为不同的子系统〉划分,并利用合理的技术对业务性能做出提升和改善,同时又极大地简化了配…

大牛用SSM框架实现了支付宝的支付功能,满满干货指导

前言 现在刷抖音经常可以看到一些老外街坊,问他们最想把什么带回自己的国家,我听过很多的回答都是:淘宝,支付宝,美食,微信,外卖,高铁等等。 确实如此,随着国家的快速发…

java---Listener Filter知识点学习

##Listener > 监听器 * 能做什么事? > 监听某一个事件的发生。 状态的改变。 * 监听器的内部机制 > 其实就是接口回调. ####接口回调 * 需求: > A在执行循环,当循环到5的时候, 通知B。 > 事先先把一个对象传递给 …

头条三面技术四面HR,就是这么简单

前言 看日期,今天都是4月了,这春招也差不多进入尾声了。 近期任有不少朋友都在找工作,很多人开始抱怨,工作可真难找啊!身边不少朋友问我咋搞呀,秋招都要结束了,工作还没着落呢…额…这个…今年…

如何保证Redis与数据库的双写一致性?进阶加薪全靠它!

我有话要说,请仔细看完 我发现一个现象,很多开发5年的程序员仍然停留在crud的阶段,这是什么原因? 最主要的原因就是基础很差,尤其对于JVM和并发编程这方面掌握的比较差,而JVM和并发编程就是非常非常重要的…

如何保证redis高可用?薪资翻倍

前言: 首先介绍一下我的同学,专科毕业应用电子技术专业,已经毕业快两年了。因为专业的原因工作一年觉得没什么发展前途就想转行,身为他的“好基友”,他觉得我这个工作挺好的,就咨询了我一下,经…

Linux中强大的输入输出重定向和管道

Linux中有三个最重要的输入输出流: Standard Input(STDIN) - 通常指键盘的输入 Standard Output(STDOUT) - 通常指显示器的输出 Standard Error(STDERR) - 通常也是重定向到显示器 默认情况下,分别是0表示标准输入(stdin),1表示标准输出(stdout),2表示标准错误。 参…

如何保证消息队列的高可用?透彻分析源码

前言 成为优秀的架构师是大部分初中级工程师的阶段性目标。优秀的架构师往往具备七种核心能力:编程能力、调试能力、编译部署能力、性能优化能力、业务架构能力、在线运维能力、项目管理能力和规划能力。 这几种能力之间的关系大概如下图。编程能力、调试能力和编…

如何化身BAT面试收割机?不吃透都对不起自己

前言 多线程相对于其他 Java 知识点来讲,有一定的学习门槛,并且了解起来比较费劲。在平时工作中如若使用不当会出现数据错乱、执行效率低(还不如单线程去运行)或者死锁程序挂掉等等问题,所以掌握了解多线程至关重要。…

Tensorflow2.0开启,从此忘记1.*版本

1.可使用GPU,提升上百倍的效率 2.可自动求导 3.内置神经网络API 使用cast,可以转换成相应的类型 转载于:https://www.cnblogs.com/ningxinjie/p/11412653.html

如何在面试中通过工厂模式来给自己加分?逆袭面经分享

拼多多三面惨败,java中间件、数据库与spring框架,答不上… 面试开火箭,工作拧螺丝…月初有个朋友面试拼多多,一面自信满满过了,结果三面却惨败…昨天朋友约我出来讨论问题在哪里,三面就答不上了&#xff0…

Hibernate学习笔记(一)

####1.1Hibernate框架的学习路线第一天:Hibernate的入门(Hibernate的环境搭建、Hibernate的API、Hibernate的CRUD)第二天:Hibernate的一级缓存、其他的API第三天:Hibernate的一对多配置、Hibernate的多对多的配置…

北理工爬虫课程学习记录

Requests post方法如果提交字典会被存到form下,如果直接提交字符串,会被存到data下 put方法和post类似,只不过他会覆盖原始数据 ###各个方法的使用### 13个 访问参数 url修改的字段 //模拟浏览器进行访问 //模拟不同的IP地址对这个网站进行访…