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) 原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,因此事务的操作如果成功就必须要完全应用到数据库, ...
随机推荐
- 在 Python 中使用 JSON
在 Python 中使用 JSON 本教程将会教我们如何使用 Python 编程语言编码和解码 JSON.让我们先来准备环境以便针对 JSON 进行 Python 编程. 环境 在我们使用 Pytho ...
- 支持向量机-完整Platt-SMO算法加速优化
完整版SMO算法与简单的SMO算法: 实现alpha的更改和代数运算的优化环节一模一样,唯一的不同就是选择alpha的方式.完整版应用了一些能够提速的方法. 同样使用Jupyter实现,后面不在赘述 ...
- MyBatis - 8.MyBatis工作原理
Mybatis 配置 1.SQLSessionFactory的初始化 根据配置文件获取 SqlSessionFactory 2.openSession获取SqlSession对象 3.getMappe ...
- IDEA 小白采坑
IDEA Debug状态下,断点第一次可以进去,之后都不能进去 调试时候不要用Ctrl+F9,如果是点击Tool Windows 上的图标的话,也要注意改图标的快捷键是不是Ctrl+F9 Ctrl+F ...
- javaScript事件(七)事件类型之键盘与文本事件
键盘事件如下: keydown:当用户按下键盘上的任意键时触发,而且如果按住不放的话,会重复触发此事件. keypress:当用户按下键盘上的字符键时触发,而且如果按住不放的话,会重复触发此事件. k ...
- 前端本地存储localStorage
1.突破cookie 4K限制,一般浏览器支持5M 2.增 删 改 查 <!DOCTYPE html> <html lang="en"> <head& ...
- node.js版本管理
Node安装 Node的安装需要依赖很多,如gcc等,首先我们需要将这些安装成功,用rpm命令查看下,果然我们并没有gcc等,所以要用yum进行安装(基于centos6.9版本): yum -y in ...
- Flask Web中用MySQL代替SQLite
由于.sqlite文件操作的诸多不便,决定常识用MySQL代替书上的SQLite作为数据库. 1.在虚拟环境中安装mysql-Python具体步骤为: <1> 安装python-dev s ...
- Flink的Windows
在讲解windows的众多操作之前,需要讲解一个概念: 源源不断的数据流是无法进行统计工作的,因为数据流没有边界,就无法统计到底有多少数据经过了这个流.也无法统计数据流中的最大值,最小值,平均值,累加 ...
- Python学习(二十九)—— pymysql操作数据库优化
转载自:http://www.cnblogs.com/liwenzhou/articles/8283687.html 我们之前使用pymysql操作数据库的操作都是写死在视图函数中的,并且很多都是重复 ...