数据库事物操作

事务

什么是事务?
转账:
1. 给wc账户减1000元
2. 给wcxf账户加1000元

当给wc账户减1000元后,抛出了异常!这会怎么样呢?我相信从此之后,wc再也不敢转账了。

使用事务就可以处理这一问题:把多个对数据库的操作绑定成一个事务,要么都成功,要么都失败!

---------------------------------------------------------------------------------------------------------------------------------------------

事物的特性:ACID

* 原子性事务中所有操作是不可再分割的原子单位。事务中所有操作要么全部执行成功,要么全部执行失败。
* 一致性事务执行后,数据库状态与其它业务规则保持一致。如转账业务,无论事务执行成功与否,参与转账的两个账号余额之和应该是不变的。
* 隔离性隔离性是指在并发操作中,不同事务之间应该隔离开来,使每个并发中的事务不会相互干扰。
* 持久性一旦事务提交成功,事务中所有的数据操作都必须被持久化到数据库中,即使提交事务后,数据库马上崩溃,在数据库重启时,也必须能保证通过某种机制恢复数据。

---------------------------------------------------------------------------------------------------------------------------------------------

MySQL操作事务

1. 开始事务:start transaction
2. 结束事务:commit//提交事物rollback//事物回滚

(1)事物回滚

(2)事物提交

 

 

---------------------------------------------------------------------------------------------------------------------------------------------

JDBC事务

1. 开始事务con.setAutoCommit(false);
2. 结束事务con.commit()con.rollback();

 

public class Jdbc2 {public static void main(String[] args) {Connection con=null;PreparedStatement pst=null;try {con = JDBCUtils.getConnection();//开启事物con.setAutoCommit(false);//开启手动事物pst=con.prepareStatement("UPDATE  acction SET mun=mun-100 WHERE username=? ");pst.setString(1, "zhangsan");pst.executeUpdate();//人为创建异常int index=1/0;pst=con.prepareStatement("UPDATE  acction SET mun=mun+100 WHERE username=? ");pst.setString(1, "wangwu");pst.executeUpdate();con.commit();//提交事物
            } catch (Exception e) {try {con.rollback();} catch (SQLException e1) {e1.printStackTrace();}e.printStackTrace();}finally{//关闭JDBCUtils.createClose(null, pst, con);}}
}

 

 

 

---------------------------------------------------------------------------------------------------------------------------------------------

保存点

保存点的是可以回滚到事务中的某个位置,而不是回滚整个事务。
回滚到保存点不会结束事务。
设置保存点:Savepoint sp = con.setSavepoint();
回滚到保存点:con.rollback(sp);

public class Jdbc1 {public static void main(String[] args) {Connection con=null;PreparedStatement pst=null;Savepoint sp=null;try{con = JDBCUtils.getConnection();con.setAutoCommit(false);//手动开启事物sp=con.setSavepoint();pst=con.prepareStatement("INSERT INTO acction(username,mun) VALUES(?,?)");for(int i=1;i<=2000;i++){if(i==1002){int index=i/0;}pst.setString(1, "lxp");pst.setInt(2, i);pst.executeUpdate();if(i%1000==0){sp=con.setSavepoint();} }con.commit();//事物提交}catch(Exception e){try {con.rollback(sp);con.commit();} catch (SQLException e1) {// TODO Auto-generated catch block
                e1.printStackTrace();}//回滚事物
              e.printStackTrace();}finally{JDBCUtils.createClose(null, pst, con) ;}}

---------------------------------------------------------------------------------------------------------------------------------------------

事务隔离级别

* 脏读:读到未提交


* 不可重复读:两次读取不一致,读取到另一事务修改的记录


* 幻读:两次读取不一致,读取到另一事务插入的记录

---------------------------------------------------------------------------------------------------------------------------------------------

四大隔离级别
* SERIALIZABLE(串行化):对同一数据的访问是串行的,即非并发的,所以不会出现任何并发问题。易出现死锁,效率太低!不可用!
* REPEATABLE READ(可重复读):防止了脏读、不可重复读,但没有防止幻读
* READ COMMITTED(读已提交):防止了脏读,但没有防止不可重复读,以及幻读
* READ UNCOMMITTED(读未提交):可能出现所有并发问题,效率最高,但不可用!

MySQL默认事务隔离级别为:REPEATABLE READ
Oracle默认事务隔离级别为:READ COMMITTED

-------------------------------------------------------------------------------------------------------------------------------------------------

MySQL设置事务隔离级别

/* 查看:*/select @@tx_isolation
/* 设置:*/set transaction isolation level 四选一

JDBC设置事务隔离级别

con.setTransactionIsolation(四选一)

------------------------------------------------------------------------------------------------------------------------------------------------------

代码JDBCUtils代码:

需要配置dbconfig.properties文件

 

public class JDBCUtils {static Properties props = null;//绑定线程static private ThreadLocal<Connection> t1=new ThreadLocal<Connection>();static {// 加载本地配置文件try {InputStream in = JDBCUtils.class.getResourceAsStream("dbconfig.properties");props = new Properties();props.load(in);} catch (IOException e) {e.printStackTrace();}// 加载驱动try {Class.forName(props.getProperty("driverClassName"));} catch (ClassNotFoundException e) {e.printStackTrace();}}/*** 获得Connection连接* @return* @throws Exception*/public static Connection getConnection() throws Exception {Connection conn = t1.get();if(conn==null){// 加载配合conn= DriverManager.getConnection(props.getProperty("url"),props.getProperty("username"), props.getProperty("password"));t1.set(conn);}return conn;}/*** 关闭所有连接* @param rs* @param statement* @param conn*/public static void createClose(ResultSet rs, PreparedStatement statement,Connection conn) {try {if (rs != null)rs.close();if (rs != null)statement.close();if (rs != null)   conn.close();
    if(t1!=null){
                t1.remove();
            }}
catch (Exception e) {e.printStackTrace();}} }

 

转载于:https://www.cnblogs.com/lxp503238/p/6639178.html

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

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

相关文章

通过OpenShift超越云技术

您是否厌倦了为您的应用程序请求新的开发机器&#xff1f; 您是否为应用程序设置新的测试环境感到烦恼&#xff1f; 您是否只想专注于和平开发应用程序而不会一直“沉迷于堆栈”&#xff1f; 我们听到你的声音。 我们也去过那里。 不用担心&#xff0c;OpenShift就在这里&#…

android+4.4+稳定性,新系统新UI!台电A10h四核安卓4.4.2性能测试

国内著名商标&#xff0c;数码用户首选品牌的台电科技在12月20日全国首发了安卓4.4.2系统&#xff0c;并且运行台电全新tUI同时&#xff0c;支持从安卓4.2系统OTA一键升级至安卓4.4.2系统&#xff01;作为国内首款升级到目前全球最新的Android4.4.2系统之后&#xff0c;整体性能…

网络知识点小结

VMware虚拟机三种联网方法及原理一、Brigde——桥接&#xff1a;默认使用VMnet0 1、原理&#xff1a; Bridge 桥"就是一个主机&#xff0c;这个机器拥有两块网卡&#xff0c;分别处于两个局域网中&#xff0c;同时在"桥"上&#xff0c;运行着程序&#xff0c;让…

在JUnit中超越核心Hamcrest

在通过JUnit和Hamcrest改进对assertEquals的文章中&#xff0c;我介绍了将Hamcrest与JUnit一起使用 。 然后&#xff0c;我查看了JUnit的内置Hamcrest Core Matcher支持 。 在本文中&#xff0c;我将介绍如何将Hamcrest的非核心匹配器与JUnit一起应用。 这些非核心匹配器默认情…

4pics1word android,4 Pics 1 Word

4 Pics 1 Word是一款非常有意思的看图猜词游戏&#xff0c;这款游戏中会给我们四张图片&#xff0c;玩家需要通过图片给出的信息来猜出是哪个词&#xff0c;看西西的介绍你可能以为这是一款千篇一律的看图猜词游戏&#xff0c;不过这里猜的不是中文而是英语单词。4 Pics 1 Word…

页面内锚点定位及跳转方法总结

接着上一篇&#xff0c;其实是一个功能&#xff0c;本来感觉挺简单的一个问题&#xff0c;没想到遇到两个坎儿&#xff0c;无语。。。 上一篇是关于scroll事件绑定的问题&#xff0c;这一篇的问题是&#xff1a;点击锚点跳转到相应DIV的问题。 最简单的方法是锚点用<a>标…

基于android的水稻叶片特征测量系统,基于Android的水稻叶片特征参数测量系统

基于Android的水稻叶片特征参数测量系统路艳1&#xff0c;肖志勇2&#xff0c;3&#xff0c;杨红云2&#xff0c;3*&#xff0c;周琼1&#xff0c;孙玉婷1【摘要】摘要&#xff1a;【目的】提供基于Android的水稻叶片特征参数测量系统&#xff0c;为农学研究提供精准数据。【方…

JAVA学习绘图颜色及其笔画属性设置字体显示文字

package com.graphics;import java.awt.*; import java.awt.geom.Rectangle2D; import java.util.Date;import javax.swing.*;/*** * author biexiansheng**/ public class DrawString extends JFrame{private Shape rect;//矩形对象private Font font;//字体对象private Date …

lightoj 1044 - Palindrome Partitioning(需要优化的区间dp)

题目链接&#xff1a;http://lightoj.com/volume_showproblem.php?problem1044 题意&#xff1a;求给出的字符串最少能分成多少串回文串。 一般会想到用区间dp暴力3个for但是这里的数据有1000&#xff0c;3个for肯定超时的。 但是这题只是判断回文串有多少个所以可以先预处理一…

对JavaFX Mobile应用程序进行性能分析

注意&#xff1a;本文最初发表于2009年&#xff0c;仅供参考。 请查阅我们其余的JavaFX文章 。 对于每个JavaFX Mobile应用程序开发人员来说&#xff0c;今天都是美好的一天。 你想知道为什么吗&#xff1f; 因为JavaME SDK 3.0已发布。 根据我午休时听到的消息&#xff0c;这是…

第六天20160810

a) 形参与实参 一、 形参为基本数据类型&#xff1a;形参改变&#xff0c;实参不变。 二、 形参为引用数据类型&#xff1a;形参改变&#xff0c;实参通常都会改变。 b) 可变长参数&#xff1a;JDK1.5开始出现 一、可变长参数只能用于…

android原生系统开发板,安卓学习必备开发板-Rayeager PX2

由谷歌主导并推动的移动终端操作系统Android&#xff0c;由于其开源开放的特性&#xff0c;自发布之日起便受到全球各大IT厂商的欢迎。在各厂商的热情推动下&#xff0c;基于Android系统的手机、平板、智能手表等各类产品层出不穷&#xff0c;迅速普及到人们的日常生活&#xf…

变量类型取值范围

ascii&#xff1a;Oct Dec Hex Char──────────────────────────101 65 41 A102 66 42 B103 67 43 C141 97 61 a142 98 62 b143 99 63 c 取值范围&#xff1a;-1 ~ 0xFFFFFFFF ~ 全1127 ~ 0x7F255 ~ 0xFF ~ 11111111 char -128 ~ 127 …

热点中的即时编译器(JIT)

即时编译器&#xff08;JIT&#xff09;的概念以及更广泛的自适应优化是除Java&#xff08;.Net&#xff0c;Lua&#xff0c;JRuby&#xff09;之外的许多语言中众所周知的概念。 为了解释什么是JIT编译器&#xff0c;我想先定义一个编译器概念。 根据维基百科&#xff0c;编译…

3.30下午

在另一台机子安装VMware workstation12和win8服务器 总是秘钥不行 很烦转载于:https://www.cnblogs.com/bgd140206314/p/6647159.html

Java并发性-任务反馈

从我 上一篇 关于java.util.concurrent包的 文章 的结尾处 摘下来 &#xff0c;这很有趣&#xff0c;有时甚至必须在并发任务启动后从它们那里获得反馈。 例如&#xff0c;假设一个应用程序必须发送电子邮件批处理&#xff0c;除了使用多线程机制外&#xff0c;您还想知道成功发…

JS中的函数(二):函数参数(你可能不知道的参数传递)

前言&#xff1a; 函数分为有参有返回值&#xff0c;有参无返回值&#xff0c;无参无返回值&#xff0c;无参有返回值&#xff1b;那么对于无参数的函数你想使用函数的调用怎么办呢&#xff1f;如果你想封装一个代码&#xff0c;实现多种功能&#xff0c;但是形参大于实参或者实…

jq查找字段忽略html标签,jQuery过滤HTML标签并高亮显示关键字的方法

本文实例讲述了jQuery过滤HTML标签并高亮显示关键字的方法。分享给大家供大家参考。具体如下&#xff1a;jQuery实现网页关键字过滤效果&#xff0c;将需要过滤的文字定义在JavaScript中&#xff0c;可定义多个&#xff0c;不过要修改JS代码为数组&#xff0c;这样可过滤出多个…

Jmeter参数化 CSV Data Set Config界面说明

Filename&#xff1a;指保存信息的文件目录&#xff0c;可以相对或者绝对路径&#xff0c;相对路径从Jmeter 的启动目录(***/bin)路径。 File Encoding:文件编码&#xff0c;默认为ANSI&#xff0c;建议设置为utf-8&#xff0c;防止遇见乱码情况。 Variable Names&#xff1a;参…

java.lang.NoClassDefFoundError:如何解决–第1部分

线程“ main”中的异常java.lang.NoClassDefFoundError是开发Java EE企业版或独立Java应用程序时可能会遇到的常见难题之一。 根本原因分析和解决过程的复杂性主要取决于Java EE中间件环境的大小。 特别是考虑到各种Java EE应用程序中存在大量的ClassLoader。 我向您建议的一系…