mysql -事物(隔离级别、脏读、不可重复读、幻读)

事物

    • 1、什么是事物
    • 2、事物的特性(ACID)
    • 3、并发事物带来的问题
      • 3.1、脏读
      • 3.2、不可重复读(查询一行数据结果不一致)
      • 3.3、幻读(查询多条数据,行数不一致)
      • 3.4、丢失修改
    • 4、事物的隔离级别
      • 4.1举例说明
    • 5、事务原理

1、什么是事物

事物是逻辑上的一组操作、要么全部执行、要么都不执行

2、事物的特性(ACID)

  1. 原子性: 事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么完全不起作用;
  2. 一致性: 执行事务前后,数据保持一致,例如转账业务中,无论事务是否成功,转账者和收款人的总额应该是不变的;
  3. 隔离性: 并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库是独立的;
  4. 持久性: 一个事务被提交之后。它对数据库中数据的改变是持久的,即使数据库发生故障也不应该对其有任何影响。

3、并发事物带来的问题

在典型的应用程序中,多个事务并发运行,经常会操作相同的数据来完成各自的任务(多个用户对统一数据进行操作)。并发虽然是必须的,但可能会导致以下的问题。

3.1、脏读

一个事物读取另一个事物没有提交的数据
mysql -事物(隔离级别、脏读、不可重复读、幻读)_第1张图片

3.2、不可重复读(查询一行数据结果不一致)

某一个事物对同一个数据前后读取的结果不一致
mysql -事物(隔离级别、脏读、不可重复读、幻读)_第2张图片

3.3、幻读(查询多条数据,行数不一致)

某一个事物,对同一个表前后查询到的行数不一致
mysql -事物(隔离级别、脏读、不可重复读、幻读)_第3张图片

3.4、丢失修改

指在一个事物读取了一个数据时,另一个事物也读取了一个数据,在第一个事物修改了这个数据后,另一个事物也修改了这个数据,则第一个事物修改的数据就会被丢失

4、事物的隔离级别

  • Read Uncommitted(读取未提交):最低的隔离级别,允许读取未提交的数据,可能会导致脏读、幻读或不可重复读
  • Read Committed(读取已提交):允许读取并发事务已经提交的数据,可以阻止脏读、但是幻读或不可重复读仍有可能发生
  • Repeatable Read(重复度):对同一字段的多次读取结果是一致的,除非数据是被本身事物自己修改,可以阻止脏读和不可重复读,但幻读仍有可能发生
  • Serializable(可串行化):最高的隔离级别,性能最低,需要加锁,完全服从ACID的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读
    mysql -事物(隔离级别、脏读、不可重复读、幻读)_第4张图片
    MySQL InnoDB 的 REPEATABLE-READ(可重读)并不保证避免幻读,需要应用使用加锁读来保证。而这个加锁读使用到的机制就是 Next-Key Locks。

4.1举例说明

命令

//查看事物的隔离级别
select @@transaction_isolation   
//设置事物的隔离级别
set session/global Transaction isolation level read uncommitted  //设置当前会话的事物隔离级别(session)
//事物提交
commit
//事务回滚
rollback

脏读,只有在read uncommitted隔离级别下才有
mysql -事物(隔离级别、脏读、不可重复读、幻读)_第5张图片
read committed解决脏读问题
mysql -事物(隔离级别、脏读、不可重复读、幻读)_第6张图片

不可重复读,在read committed隔离级别下演示
mysql -事物(隔离级别、脏读、不可重复读、幻读)_第7张图片
在repeatable committed隔离级别下解决不可重复读问题
mysql -事物(隔离级别、脏读、不可重复读、幻读)_第8张图片

在repeatable read隔离级别别下出现幻读问题
mysql -事物(隔离级别、脏读、不可重复读、幻读)_第9张图片
串行化操作,一次只允许一个事务执行
mysql -事物(隔离级别、脏读、不可重复读、幻读)_第10张图片

5、事务原理

InnoDB存储引擎里事务的特性中
持久性是通过日志undolog实现的
原子性、一致性、 undo log 实现
事务的隔离性是通过锁机制和MVCC实现的
mysql -事物(隔离级别、脏读、不可重复读、幻读)_第11张图片
mysql -事物(隔离级别、脏读、不可重复读、幻读)_第12张图片

你可能感兴趣的:(MySql,mysql,数据库,java)