欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

复习_事务和隔离级别

程序员文章站 2022-05-09 15:59:57
...

1.事务的概述

  • 事务指的是逻辑上的一组操作,组成这组操作的各个单元要么全都成功,要么全都失败.
  • 事务作用:保证在一个事务中多次操作要么全都成功,要么全都失败.

1.1 mysql事务操作

  • start transaction; 开启事务
  • commit; 提交事务
  • rollback; 回滚事务

MYSQL中可以有两种方式进行事务的管理:

  • 自动提交:MySql默认自动提交。及执行一条sql语句提交一次事务。
  • 手动提交:先开启,再提交

1.2 JDBC事务操作

  • conn.setAutoCommit(false)
    开启事务(关闭自动提交)
  • conn.commit()
    提交事务
  • conn.rollback()
    回滚事务

1.3 DBUtils事务操作

  • conn.setAutoCommit(false) 开启事务
  • new QueryRunner() 创建核心类,不设置数据源(手动管理连接)
  • query(conn , sql , handler, params ) 或update(conn, sql , params) 手动传递连接
  • DbUtils.commitAndClose(conn) 提交并关闭连接
  • DbUtils.rollbackAndClose(conn) 回滚并关闭连接

2.ThreadLocal

ThreadLocal用于在当前线程*享数据
ThreadLocal工具类底层就是一个Map,key存放的当前线程,value存放需要共享的数据

public static ThreadLocal<String> local = new ThreadLocal<String>();

3.事务的特性 ACID (理解)

数据库的事务必须具备ACID特性,ACID是指 Atomic(原子性)、Consistensy(一致性)、Isolation(隔离型)和Durability(持久性)的英文缩写。

  1. 原子性(Atomicity)
    事务包装的一组sql,要么都执行成功,要么都失败。这些操作是不可分割的。
  2. 一致性(Consistency)
    数据库的数据状态是一致的。
    事务的成功与失败,最终数据库的数据都是符合实际生活的业务逻辑。一致性绝大多数依赖业务逻辑和原子性。
  3. 持久性:(Durability)
    事务成功提交之后,对于数据库的改变是永久的。哪怕数据库发生异常,重启之后数据亦然存在。
  4. 隔离性(Isolation)
    一个事务的成功或者失败对于其他的事务是没有影响。2个事务应该相互独立。

4.事务的隔离级别

如果不考虑事务的隔离型,由于事务的并发,将会出现以下问题:

  1. 脏读 – 最严重,杜绝发生
  2. 不可重复读
  3. 幻读(虚读)

4.1 脏读

指一个事务读取了另外一个事务 未提交的数据。
复习_事务和隔离级别
一个事务读取了另一个事务没有提交的数据,非常严重。应当尽量避免脏读。

4.2 不可重复读

在一个事务内多次读取表中的数据,多次读取的结果不同
复习_事务和隔离级别

4.3 幻读(虚读)

复习_事务和隔离级别

数据库规范规定了4种隔离级别,分别用于描述两个事务并发的所有情况

  1. read uncommitted 读未提交,一个事务读到另一个事务没有提交的数据。
    存在:3个问题(脏读、不可重复读、虚读)。
    解决:0个问题
  2. read committed 读已提交,一个事务读到另一个事务已经提交的数据
    存在:2个问题(不可重复读、虚读)。
    解决:1个问题(脏读)
  3. repeatable read() :可重复读,在一个事务中读到的数据始终保持一致,无论另一个事务是否提交。
    存在:1个问题(虚读)。
    解决:2个问题(脏读、不可重复读)
  4. serializable 串行化,同时只能执行一个事务,相当于事务中的单线程。
    存在:0个问题。
    解决:3个问题(脏读、不可重复读、虚读)

安全和性能对比:

  • 安全性:串行化>可重复读 >读已提交 > 读未提交
  • 性能 : 串行化< 可重复读 < 读已提交 < 读未提交

常见数据库的默认隔离级别:

  • MySql:repeatable read
  • Oracle:read committed

在mysql数据库中,底层对于幻读做了优化,演示不了。

相关标签: 事务 隔离级别