一、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事务、事务隔离级别的更多相关文章

  1. SQL事务的四种隔离级别和MySQL多版本并发控制

      SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的那些改变时可见的,那些是不可见的.低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销. ReadUncommitted( ...

  2. Mysql加锁过程详解(6)-数据库隔离级别(2)-通过例子理解事务的4种隔离级别

    Mysql加锁过程详解(1)-基本知识 Mysql加锁过程详解(2)-关于mysql 幻读理解 Mysql加锁过程详解(3)-关于mysql 幻读理解 Mysql加锁过程详解(4)-select fo ...

  3. 【MySQL】:事务四大特性与隔离级别

    目录 一.事务的概念 二.事务的四大特性 1.原子性 2.一致性 3.隔离性 4.持续性 三.事务语句 1.开启事务:start transaction 2.事务回滚:rollback 指定回滚点 3 ...

  4. 数据库事务ACID特性及隔离级别

    数据库ACID特性介绍 1.原子性(Atomic)一个事务被视为一个不可分割的最小工作单元,这个事务里的所有操作要么全部成功执行,要么全都不执行,不能只执行其中的一部分操作.实现事务的原子性,要支持回 ...

  5. spring事务传播属性和隔离级别

    猫咪咪的Java世界 spring事务传播属性和隔离级别 博客分类: Spring java编程   1 事务的传播属性(Propagation) 1) REQUIRED ,这个是默认的属性 Supp ...

  6. Spring事务传播机制与隔离级别(转)

    Spring事务传播机制与隔离级别 博客分类: Spring   转自:http://blog.csdn.net/edward0830ly/article/details/7569954 (写的不错) ...

  7. 网络协议 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 ...

  8. MySQL事务的四种隔离级别

    事务的基本要素: 原子性(atomicity):事务开始后的全部操作, 要么全部执行成功,如果中间出现错误,事务回滚到事务开始前的状态. 一致性(Consistency):事务开始后,数据库的完整性约 ...

  9. mysql的事务四个特性以及 事务的四个隔离级别

    一.事务四大属性 分别是原子性.一致性.隔离性.持久性. 1,原子性(Atomicity) 原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,因此事务的操作如果成功就必须要完全应用到数据库, ...

  10. mysql的事务四个特性以及事务的四个隔离级别

    一.事务四大属性 分别是原子性.一致性.隔离性.持久性. 1.原子性(Atomicity) 原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,因此事务的操作如果成功就必须要完全应用到数据库, ...

随机推荐

  1. data-key

    在foreach或者each循环中给按钮赋予值 html中:data-key="@config.key" js里获取值: var key = $(this).data(" ...

  2. 饮冰三年-人工智能-Python-12之利其器pycharm

    1:下载.安装.与激活这里不再介绍了.需要注意的是激活时需要修改C:\Windows\System32\drivers\etc\hosts文件 2:工具使用 2.1 HelloWorld  File& ...

  3. 页面布局之--Font Awesome+导航

    页面布局之--Font Awesome+导航 Font Awesome为您提供可缩放的矢量图标,您可以使用CSS所提供的所有特性对它们进行更改,包括:大小.颜色.阴影或者其它任何支持的效果. 下载地址 ...

  4. PAT Basic 1065 单身狗

    单身狗(25) 时间限制 300 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue "单身狗"是中文对于单身人士的 ...

  5. zookeeper 学习 客户端Acl操作笔记

    Acl = Access control list create /node2 node2data [zk: localhost:2181(CONNECTED) 14] addauth digest ...

  6. OSGi HelloWorld

    1.创建项目 2.Debug Configurations,配好之后,可以点一下右下角的Validate Bundles验证一下是否有问题 3.Debug

  7. python全栈开发day60-django_app ORM 完整登录案例

    day60 内容回顾: 1. HTTP协议: 1.请求(浏览器发给服务端的消息——request) 请求方法 URL 协议版本\r\n k1:v1\r\n k2:v2\r\n \r\n 请求体 —— ...

  8. net core体系-web应用程序-4asp.net core2.0 项目实战(1)-6项目缓冲方案

    Asp.Net Core2.0下使用memcached缓存. Memcached目前微软暂未支持,暂只支持Redis,由于项目历史原因,先用博客园开源项目EnyimMemcachedCore,后续用到 ...

  9. Linux安装Tomcat-Nginx-FastDFS-Redis-Solr-集群——【第二集之新建虚拟机】

    1, 2, 3, 4,(如果选择版本时,发现选项中没有centos,可以选择other linux2.6.x kernel) 5,(虚拟机命名:Centos_用途_IP) 6,(选择Split vir ...

  10. IDEA控制台问题:At least one JAR was scanned for TLDs yet contained no TLD

    参考连接: https://www.cnblogs.com/interdrp/p/7763040.html 1.调整Tomcat对应类的log级别 2.观察Tomcat日志打印信息 3.调整${tom ...