将一组有序的增删改操作,看做一个独立的执行单元,这个独立的执行单元就是事物
银行转账: 怎么才算转账成功
A给B转账
1.先更新A账户的余额信息 更新语句
2.更新B账户的余额信息 更新语句
特点: 一个事物中,只要有一个操作失败,整个事物就回滚,所做操作都不生效
作用: 为了保障数据的安全
数据库存储引擎,是数据库底层构建的核心,负责底层数据持久化和软件交互的序列化操作、校验过程以及交互过程,通过数据库存储引擎完成创建、查询、更新和删除数据。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,使用不同的存储引擎,还可以 获得特定的功能。现在许多不同的数据库管理系统都支持多种不同的数据引擎。
(1) InnoDB
InnoDB是事务型数据库的首选引擎,支持事务,支持行锁定和外键
存储分两个文件存储: 一个文件存表结构,一个文件存索引和数据
(2) MyISAM
在Web、数据仓储和其他应用环境下最常使用的存储引擎之一。MyISAM拥有较高的插入、查询速度,但****不支持事物****,不支持外键。
将数据存储在三个文件中:一个存结构 一个存索引 一个存数据
事务在操作过程中,为了保障批量数据在批量操作过程中的数据安全性,制定了一些事务本身必须具备的特性,通过对这些特性约束的具体实现,保障事务执行的安全性和可靠性;这些特性被统称为ACID特性,分别为
• 原子性(atomicity)
• 一致性(consistency)
• 隔离性(isolation)
• 持久性(durability)
原子性:要么都成功 要么都失败,失败后操作回滚,不会对数据库的数据造成影响
事务包含的所有操作要么全部成功,要么全部失败回滚,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。如A给B转帐,不会出现A的钱少了,B的钱却没有增加的情况。
一致性: 事务开始前和结束后数据库的状态保持一致,数据库的完整性约束没有被破坏 。如转账业务完成后A减少100,B一定增加100
持久性:持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。
隔离性:当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事物之间要相互隔离互不影响
脏读(dirty read):A事务读取B事务尚未提交的更改数据,并在这个数据基础上操作。如果B事务回滚,那么A事务读到的数据根本不是合法的,称为脏读。
不可重复读(unrepeatable read): A事务读取了一条数据B事务已经提交的更改数据 。假设A在取款事务的过程中,B往该账户转账100元,A两次读取账户的余额发生不一致:
幻读(phantom read): A事物读取了多条数据,并做了计算,此时B事物新添加了一条数据,导致我们计算的结果出现了偏差。
A事务读取B事务提交的新增数据,这时A事务将出现幻象读的问题。幻象读一般发生在计算统计数据的事务中,举一个例子,假设银行系统在同一个事务中,两次统计存款账户的总金额,在两次统计过程中,刚好新增了一个存款账户,并存入100元,这时,两次统计的总金额将不一致
SQL标准化结合实际操作过程中的数据表现,定义了4类隔离级别,制定了一些具体规则用来限定事务内外的哪些改变是可见的,哪些是不可见的。
(1) Read Uncommitted(读未提交)
一个事务不能修改其他事务正在修改的数据,但可以读取到其他事务中尚未提交的修改,这些修改如果未被提交,将会成为脏数据,
(2) Read committed(读已提交)
只允许读取已经被提交的数据,防止脏读发生。
(3) Repeat Read(可重复读)
这一级别下,不允许事务读取在该事务开始后新提交的数据。即防止了不可重复读的发生。
(4) Serializable(可串行化)
所有的事务必须串行化执行,只要有事务在对表进行查询,那么在此事务提交前,任何其他事务的修改都会被阻塞。
MySQL终端,可以通过DBMS命令将事务行为发送至对应的DB完成事务的最终执行。
-- 设置事物隔离级别
set sessiion transaction isolation level 隔离级别
-- 开启一个事物
start transaction;
-- 提交事物
commiit;
-- 事物回滚
rollback;
(1)案例操作:读未提交与脏读*
上述操作中,终端1中的事务A并没有提交的情况下,insert的数据,在终端2的事务B中读取到了,此种情况下如果事务A进行了事务回滚,事务B重新执行语句就会发现数据又消失了,这就是第一种读未提交模式下出现的数据脏读的典型示例,如下图所示: