什么是事务?

  • 事务就是逻辑上的一组操作,组成事务的各个执行单元,操作要么全部成功,要么全部失败.
  • 以转账为例: 张三给李四转账,张三扣1000,李四加1000; 加钱和扣钱两个操作组成了一个事务.

1. 事务的四大特性

  • 原子性(Atomicity): 事务中所有操作是不可再分割的原子单位. 事务中所有操作要么全部执行成功,

    要么全部执行失败.
  • 一致性(Consistency): 事务的其他特性都是为了这一特性服务的.即事务执行后,数据库状态和其他业

    务规则保持一致, 如转账业务,无论事务执行成功与否,参与转账的两个帐号余额之和应该是不变的.
  • 隔离性(Isolation): 指在并发操作中,不同事务之间应该隔离开来,使每个并发中的事务不会相互干扰.
  • 持久性(Durability): 一旦事务提交成功,事务中所有的数据操作都必须被持久化到数据库中,即使事务

    提交后,数据库马上崩溃了,在数据库重启时,也必须能保证通过某种机制恢复数据.

2. MySql 中操作事务

在默认的情况下,MySql 每执行一条 SQL 语句,都是一个单独的事务.如果需要在一个事务中包含多条 SQL 语句,

那么需要开启事务和结束事务:

  • 开启事务: start transaction;
  • 结束事务: commit 或 rollback;
// 示例: 张三给李四转账 100

START TRANSACTION; // 开启事务
UPDATE account SET balance=balance-100 WHERE id=1;
UPDATE account SET balance=balance+100 WHERE id=2;
ROLLBACK; // 回滚, 表示转账失败 START TRANSACTION; // 开启事务
UPDATE account SET balance=balance-100 WHERE id=1;
UPDATE account SET balance=balance+100 WHERE id=2;
COMMIT; // 提交, 表示转账成功

3. JDBC 中操作事务

  1. 在 JDBC 中操作事务,都是通过 Connection 完成的! 同一个事务中所有的操作,必须使用同一个 Connection 对象.
  2. Connection 对象与操作事务相关的方法:
    • setAutoCommit(false): 表示开启事务;
    • commit(): 表示提交事务;
    • rollback(): 表示回滚事务.
// 代码格式:
try{
con.setAutoCommit(false); // 开启事务
....
..
con.commit(); // 提交事务
}catch(){
con.rollback(); // 回滚事务
} //

4. 事务隔离级别

1. 事务的并发读问题

  • 脏读(dirty read): 读到了另一事务的未提交更新数据, 即读到了脏数据;
  • 不可重复读(unrepeatable read): 对同一记录的两次读取不一致, 因为另一事务对该记录做了修改;
  • 幻读(虚读,phantom read): 对同一张表的两次查询不一致, 因为另一事务插入了一条记录.

2. 不可重复读和幻读的区别

  • 不可重复读是读取到了另一事务的更新;
  • 幻读是读取到了另一事务的插入.

3. 四大隔离级别

3.1 SERIALIZABLE (串行化)
  • 三种读问题都能处理;
  • 不会出现任何并发问题, 因为它对同一数据的访问是串行的, 非并发访问;
  • 性能最差;
3.2 REPEATABLE READ(可重复读)
  • 防止脏读和不可重复读,不能处理幻读;
  • 性能比 SERIALIZABLE 好;
  • MySQL 数据库默认;
3.3 READ COMMITED (读已提交数据)
  • 防止脏读, 没有处理不可重复读, 也没有处理幻读;
  • 性能比 REPEATABLE READ 好;
  • Oracle 数据库默认.
3.4 READ UNCOMMITED(读未提交数据)
  • 可能出现任何事务并发问题;
  • 性能最好;

5. MySQL 隔离级别

  • MySQL 的默认隔离级别为 REPEATABLE READ;
  • 查询隔离级别语句: select @@tx_isolation;

6. JDBC 设置隔离级别

  • con.setTransactionIsolation(int level);

参考资料:

JavaWeb 之事务的更多相关文章

  1. Hibernate框架第二天

    ### Hibernate的持久化类 ### ---------- **什么是持久化类** 1. 持久化类:就是一个Java类(咱们编写的JavaBean),这个Java类与表建立了映射关系就可以成为 ...

  2. 框架之 hibernate之二

    1. Hibernate持久化对象的状态 2. Hibernate的一级缓存 3. Hibernate操作持久化对象的方法 4. Hibernate的基本查询 Hibernate的持久化类 什么是持久 ...

  3. Hibernate的持久化对象

     Hibernate的持久化类 什么是持久化类        1. 持久化类:就是一个Java类(咱们编写的JavaBean),这个Java类与表建立了映射关系就可以成为是持久化类.        * ...

  4. javaweb学习总结(三十八)——事务

    一.事务的概念 事务指逻辑上的一组操作,组成这组操作的各个单元,要不全部成功,要不全部不成功. 例如:A——B转帐,对应于如下两条sql语句  update from account set mone ...

  5. 传智播客JavaWeb day11--事务的概念、事务的ACID、数据库锁机制、

    1. 什么叫做事务? 2.默认情况下每一条sql语句都是一个事务,然后自动提交事务  ps:如果想多条语句占一个事务,则可以手动设置SetAutoCommit为false 3.关键字 start tr ...

  6. JavaWeb学习总结(十二)--事务

    一.事务的介绍 1.1 什么是事务 银行转账!张三转10000块到李四的账户,这其实需要两条SQL语句: 给张三的账户减去10000元: 给李四的账户加上10000元. 如果在第一条SQL语句执行成功 ...

  7. 【JAVAWEB学习笔记】19_事务

    事务 学习目标 案例-完成转账 一.事务概述 1.什么是事务 一件事情有n个组成单元 要不这n个组成单元同时成功 要不n个单元就同时失败 就是将n个组成单元放到一个事务中 2.mysql的事务 默认的 ...

  8. javaWeb事务

    JDBC事务: cmd 命令上的事务开启:  start transaction;   /  begin; 回滚   rollback; 提交    commit; JDBC事务控制: 开启事务:co ...

  9. JavaWeb学习笔记七 事务

    什么是事务?一件事情有n个组成单元 ,要么这n个组成单元同时成功,要么n个单元就同时失败.就是将n个组成单元放到一个事务中. mysql的事务 默认的事务:一条sql语句就是一个事务,默认就开启事务并 ...

随机推荐

  1. Linux 平台如何查看某个进程的线程数?

    Linux 平台如何查看某个进程的线程数?   三种方法:1. 使用top命令,具体用法是 top -H 加上这个选项,top的每一行就不是显示一个进程,而是一个线程. 2. 使用ps命令,具体用法是 ...

  2. JPA学习笔记1——JPA基础 (转自CSDN)

    http://blog.csdn.net/chjttony/article/details/6086298 1.JPA简介: Java持久化规范,是从EJB2.x以前的实体Bean(Entity be ...

  3. linux phpredisAdmin安装步骤

    1:linux安装apache环境, 这一步可以不用安装plsql http://www.cnblogs.com/lufangtao/archive/2012/12/30/2839679.html 2 ...

  4. 关于行内元素之间有空隙的问题,例如span与input之间

    问题如图: 想要的是下面的效果,而却出现上面的效果,解决方法如下: 对于行元素span或者input来说 很多人会用inline-block来显示他们,但是往往发现  中间会留一段小空隙 , 其实这个 ...

  5. eclipse代码凝视之模板xml

    曾经在eclipse中配置凝视的时候,都是各自在自己电脑上配置凝视,每一个同事风格不一样,并且配置繁琐.假设新来的同事忘了提醒,可能就没有配置凝视了.所以我就把类.方法的凝视写成xml文件.然后将配置 ...

  6. POJ 2528 Mayor's posters 离散化+线段树

    题目大意:给出一些海报和贴在墙上的区间.问这些海报依照顺序贴完之后,最后能后看到多少种海报. 思路:区间的范围太大,然而最多仅仅会有10000张海报,所以要离散化. 之后用线段树随便搞搞就能过. 关键 ...

  7. response.addCookie(cookie),添加失败

    问题:添加cookie到浏览器如下,在浏览器f12查看请求过程,发现cookie中只添加了:JSESSIONID E849DAFEE4A36B6D955F9D96D6D06207 却没有想要的“use ...

  8. [Android]生成heap dump文件(.hprof)

    Android生成heap dump文件(.hprof) 一个heap dump就是一个程序heap的快照,能够获知程序的哪些部分正在使用大部分的内存. 它保存为一种叫做HPROF的二进制格式.对于A ...

  9. linux前后台任务切换管理

    liuyuan@ebuinfo:/var/www/projects/PHPExcel/Examples$ vi 33chartcreate-line.php & [] liuyuan@ebui ...

  10. bootstrap-table接合knockout.js

    function responseHandler(data) { if (data.ErrorNo > 0) { return; } var count = data.Data.TotalRow ...