一、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) 原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,因此事务的操作如果成功就必须要完全应用到数据库, ...
随机推荐
-
RabbitMQ学习系列(三): C# 如何使用 RabbitMQ
上一篇已经讲了Rabbitmq如何在Windows平台安装,还不了解如何安装的朋友,请看我前面几篇文章:RabbitMQ学习系列一:windows下安装RabbitMQ服务 , 今天就来聊聊 C# 实 ...
-
学习js 优先级
以前很少关注js优先级 主要哦是技术菜鸟老加班没时间技术菜鸟 最重要的是记不住特点.......... 1级 . [] () 字段访问.数组索引.函数调用和表达式分组 通过观察可以发现 . 字段访问- ...
-
[Swust OJ 85]--单向公路(BFS)
题目链接:http://acm.swust.edu.cn/problem/0085/ Time limit(ms): 5000 Memory limit(kb): 65535 Descriptio ...
-
python 开发利器
UliPad 初体验----python 开发利器 Posted on 2013-10-28 22:36 虫师 阅读(436) 评论(3) 编辑 收藏 学习python 有段时间,最近博客更新比较慢了 ...
-
Top 20 JavaScript Projects of 2017
https://www.youtube.com/watch?v=SUMn8y3pi28 20. AngularJS 1 19. Passport 18. Pug 17. Socket.IO 16. J ...
-
[TPYBoard-Micropython教程之1] 运行第一个脚本——点亮LED
转载请注明:@小五义http://www.cnblogs.com/xiao*QQ群:64770604 会python就能做硬件! 一.TPYBoard V102开发板 TPYBoard V102 ...
-
mysql commit 和 rollback
转自:http://blog.csdn.net/ying_593254979/article/details/12134629 SQL 语言类型 从功能上划分,SQL 语言可以分为DDL,DML和DC ...
-
Synchronized锁性能优化偏向锁轻量级锁升级 多线程中篇(五)
不止一次的提到过,synchronized是Java内置的机制,是JVM层面的,而Lock则是接口,是JDK层面的 尽管最初synchronized的性能效率比较差,但是随着版本的升级,synchro ...
-
【Java每日一题】20170309
20170308问题解析请点击今日问题下方的“[Java每日一题]20170309”查看(问题解析在公众号首发,公众号ID:weknow619) package Mar2017; public cla ...
-
Android辅助开发工具说明
1.aapt(Android Asset Packaging Tool):用于建立zip包(zip.jar.apk),也可用于将资源编译到二进制的assets:2.adb(Android Debug ...