MySql中的事务、JDBC事务、事务隔离级别
一、MySql事务
之前在Oracle中已经学习过事务了,这个东西就是这个东西,但是在MySql中用法还是有一点不同,正好再次回顾一下。
先看看MySql中的事务,默认情况下,每执行一条SQL语句,都是一个单独的事务。如果需要在一个事务中包含多条SQL语句,就需要开启和结束事务。
开始事务:start transaction
结束事务:commit或rollback
在执行SQL语句之前,先执行start transaction,这就开启了一个新的事务,然后就可以去执行多条SQL语句,最后要结束事务,commit表示提交,即事务中多条SQL语句造成的影响会持久化到数据库中。rollback表示回滚,一切恢复到事务的起点,事务开始之后所到的操作全当没有发生过。
在orcale中拿银行转账举过例子,现在在MySql中实现以下:
首先建了一个银行账户表

现在张三余额800,李四余额1200,下面李四向张三转账200.

在两句update语句之后数据库貌似是变了,这时候注意其他用户看到的还是没有变化的数据库,因为没有提交,这时候在本用户查看好像是转成功了,但是一个rollback,一切归于开始。
二、JDBC事务
JDBC操作事务,全部都是由Connection完成。Connection的三个方法与事务有关
setAutoCommit(boolean):设置是否自动提交事务,如果不自动提交,那这句就表示事务的开始。
commit():表示提交事务
rollback():表示回滚事务
JDBC操作事务的代码格式
try{
con.setAutoCommit(fasle);
....
....
con.commit();
}catch(){
con.rollback();
}
如果对事务的操作抛出异常,那么肯定就执行不来,所以回滚,要是没有出错,那就提交。
这里一定要注意的JDBC操作事务一定要使用一个Connection对象!!!!再拿银行转账来演示,首先建一个账户类。
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException; /**
* @author WangXinwei
*使用自建工具类JdbcUntils返回Connection对象
*/
public class Bank {
public void account(String name,int blance) throws SQLException{
Connection conn=JdbcUntils.getConn();
String sql="update bank set blance=blance+? where name=?";
PreparedStatement ps=conn.prepareStatement(sql);
ps.setInt(1, blance);
ps.setString(2, name);
ps.executeUpdate();
}
}
使用JDBC操作事务
import java.sql.Connection;
import java.sql.SQLException; /**
* @author WangXinwei
* 传入转账方,收账方,转账金额
*
*/
public class Demo3 { public void demo(String from, String to, int money) {
Connection conn = JdbcUntils.getConn();
try {
conn.setAutoCommit(false);
Bank bank = new Bank();
bank.account(from, -money);
bank.account(to, +money);
conn.commit();
} catch (Exception e) {
// TODO: handle exception
try {
conn.rollback();
conn.close();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
} finally {
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} }
因为我使用的是单例模式返回的Connection对象,所以是一个对象,满足之前说的。
三、事务的隔离级别
事务的问题一般都是出现的并发操作的时候。
并发事务问题有五种,其中两种是更新问题,三种是读问题。重点看并发读问题,在这之前,先略微了解一下更新问题
1. 第一类丢失更新(lost update): 在完全未隔离事务的情况下,两个事务更新同一条数据资源,某一事务异常终止,回滚造成第一个完成的更新也同时丢失。
2. 第二类丢失更新(second lost updates):是不可重复读的特殊情况,如果两个事务都读取同一行,然后两个都进行写操作,并提交,第一个事务所做的改变就会丢失。
并发读问题:
1.脏读:读到未提交更新数据,就是读到另一个事务未提交数据,就是脏数据。
比如:

2.不可重复读:对同一记录两次读取不一致,因为另一事务对该记录做了修改
比如:

3.幻读:对同一张表的两次查询不一致,因为另一事务插入了一条数据
比如:

不可重复读和幻读有什么区别呢?
不可重复读是读到了另一个事务的更新
幻读是读到了另个一表的插入(MySql中无法测试幻读)
四大隔离级别:
四个等级的隔离级别,在除了隔离级别不同什么都相同的情况下处理结果是不同的,因为四种隔离级别对并发数据的处理能力是不同的。
1.SERIALIZABLE(串行化)
因为是串行化,所以不会出现任何问题,效率最差
2.REPEATABLE READ(可重复读)MySql默认
防止脏读和不可重复读,不能防止幻读
3.READ COMMITTED(读已提交数据)
防止脏读
4.READ UNCOMMITTED(读未提交数据)
可能出现任何问题,效率最好
查看MySql中隔离级别,使用select @@tx_isolation查看

也可以通过 set isolationlevel [4选1] 来设置隔离级别
JDBC设置隔离级别:
依旧通过Connection对象,使用方法setTransactionisolation[ int level]
参数可选为

MySql中的事务、JDBC事务、事务隔离级别的更多相关文章
- SQL事务的四种隔离级别和MySQL多版本并发控制
SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的那些改变时可见的,那些是不可见的.低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销. ReadUncommitted( ...
- Mysql加锁过程详解(6)-数据库隔离级别(2)-通过例子理解事务的4种隔离级别
Mysql加锁过程详解(1)-基本知识 Mysql加锁过程详解(2)-关于mysql 幻读理解 Mysql加锁过程详解(3)-关于mysql 幻读理解 Mysql加锁过程详解(4)-select fo ...
- 【MySQL】:事务四大特性与隔离级别
目录 一.事务的概念 二.事务的四大特性 1.原子性 2.一致性 3.隔离性 4.持续性 三.事务语句 1.开启事务:start transaction 2.事务回滚:rollback 指定回滚点 3 ...
- 数据库事务ACID特性及隔离级别
数据库ACID特性介绍 1.原子性(Atomic)一个事务被视为一个不可分割的最小工作单元,这个事务里的所有操作要么全部成功执行,要么全都不执行,不能只执行其中的一部分操作.实现事务的原子性,要支持回 ...
- spring事务传播属性和隔离级别
猫咪咪的Java世界 spring事务传播属性和隔离级别 博客分类: Spring java编程 1 事务的传播属性(Propagation) 1) REQUIRED ,这个是默认的属性 Supp ...
- Spring事务传播机制与隔离级别(转)
Spring事务传播机制与隔离级别 博客分类: Spring 转自:http://blog.csdn.net/edward0830ly/article/details/7569954 (写的不错) ...
- 网络协议 finally{ return问题 注入问题 jdbc注册驱动问题 PreparedStatement 连接池目的 1.2.1DBCP连接池 C3P0连接池 MYSQL两种方式进行实物管理 JDBC事务 DBUtils事务 ThreadLocal 事务特性 并发访问 隔离级别
1.1.1 API详解:注册驱动 DriverManager.registerDriver(new com.mysql.jdbc.Driver());不建议使用 原因有2个: >导致驱动被注册2 ...
- MySQL事务的四种隔离级别
事务的基本要素: 原子性(atomicity):事务开始后的全部操作, 要么全部执行成功,如果中间出现错误,事务回滚到事务开始前的状态. 一致性(Consistency):事务开始后,数据库的完整性约 ...
- mysql的事务四个特性以及 事务的四个隔离级别
一.事务四大属性 分别是原子性.一致性.隔离性.持久性. 1,原子性(Atomicity) 原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,因此事务的操作如果成功就必须要完全应用到数据库, ...
- mysql的事务四个特性以及事务的四个隔离级别
一.事务四大属性 分别是原子性.一致性.隔离性.持久性. 1.原子性(Atomicity) 原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,因此事务的操作如果成功就必须要完全应用到数据库, ...
随机推荐
- 数据增强(每10度进行旋转,进行一次增强,然后对每张图片进行扩充10张patch,最后得到原始图片数*37*10数量的图片)
# -*- coding: utf-8 -*-"""Fourmi Editor This is a temporary script file.""& ...
- IEDA序列化设置
- Mongodb for .Net Core 封装类库
一:引用的mongodb驱动文件版本为 Mongodb.Driver 20.4.3 二:我只是进行了常用方法的封装,如有不当之处,请联系我 创建mongodb的连接 using MongoDB.Bso ...
- C#学习-类的成员
定义完类之后,还需在类中定义成员. 类的成员包括字段.属性.方法和构造函数等,它们与类一样,也都有自己的访问权限.以下是 public,同一个程序集或引用该程序集的其他程序集都可以访问 private ...
- Jmeter入门(压力测试)
Jmeter介绍 Jmeter是一款使用Java开发的,开源免费的,测试工具, 主要用来做功能测试和性能测试(压力测试/负载测试). 而且用Jmeter 来测试 Restful API, 非常好用. ...
- 【bzoj1264】[AHOI2006]基因匹配Match 树状数组
题解: 一道比较简单的题目 容易发现状态数只有5*n个 而转移需要满足i1<i2;j1<j2 那么很明显是二维平面数点 暴力一点就是二维树状数组+map 5nlog^3 比较卡常 但是注意 ...
- Thinkphp框架网站 nginx环境 访问页面access denied
今日不熟一个tiinkphp框架网站的时候,由于服务器环境是centos6.5+nginx1.8,已经运行php商城项目很正常, 本以为一切比较简单,直接新建了项目文件夹,xftp上传了程序,并配置n ...
- MySQL主从数据同步延时分析
一.MySQL数据库主从同步延迟 要了解MySQL数据库主从同步延迟原理,我们 ...
- ELK日志分析平台环境部署 (yum安装)
前言:通常体质被分散存储在不同的设备上面,在庞大的服务器集群中,我们需要集中化的管理,日志的统计和检索,一般我们使用grep和awk,wc等linux命令虽然能够实现检索和统计,但是呢,对于要求更高的 ...
- Codeforces 873F Forbidden Indices 字符串 SAM/(SA+单调栈)
原文链接https://www.cnblogs.com/zhouzhendong/p/9256033.html 题目传送门 - CF873F 题意 给定长度为 $n$ 的字符串 $s$,以及给定这个字 ...