数据库事务四大特性+隔离级别

要熟悉事务之前我们先了解一下SQL:

1.SQL(结构化查询语言)分类:

  • 数据查询语言(DQL):负责数据查询,而不对数据本身进行修改,常见的保留字有:select, from, where
    group by ,having,order by;
  • 数据定义语言(DDL):负责数据结构定义与数据库对象定义的语言,常用语法:create ,alter ,drop;
  • 数据操纵语言(DML):访问数据库的指令集,有insert(插入), update(更新) ,delete(删除)三种指令;
  • 数据控制语言(DCL):控制数据访问权限的指令,由 grant(授权) 和 revoke(撤销权限) 组成;
  • 指针控制语言(CCL):对一个或多个表单独行的操作
  • 事务处理语言(TPL):确保数据更新;commit(事务提交),rollback(事务回退)

2.事务:

概念:事务就是一组DML语句组成,这些语句在逻辑上存在关联性,有要么全部成功,要么全部失败。

3.事务四大特性(ACID):

(1)原子性:一个事务是一个不可分割的整体,为了保证事务的总体目标,事务必须具有原子性,即当数据修改时,要么全部执行,要么全部不执行。即,不允许事务部分的完成,避免了只执行这些操作的一部分带来的错误。

(2)一致性:一个事务再执行之前和执行之后,数据库数据必须保持一致性。数据库的一致性状态应该满足模式所制定的约束条件,那么在完整执行该事务后,数据库仍处于一致性状态。例如:银行转账,转账前后两个账户金额之和不变。

(3)隔离性:由并发事务所做的修改必须与任何其他并发事务所做的修改隔离。事务查看数据库时数据所处的状态,要么是另一并发事务修改他之前的状态,要么是另一事务修改它之后的状态,事务不会查看中间状态的数据。

(4)持久性:永久性,事务完成之后,DBMS保证他对数据库中数据的修改是永久的,当系统或者介质发生故障时,该修改也永久保持,持久性一般通过数据库备份与恢复来保证。

4.由于并发所带来的数据不一致性:

(1)更新丢失:两个事务同时更新一行数据,一个事务对数据的更新把另一个事务对数据的更新覆盖了,只是因为系统没有执行任何锁操作,因此并发并没有被隔离开来。

(2)脏读:一个事务读取到了另一个事务未提交的数据操作结果,这是相当危险的,印尼为很可能所有的操作都被回滚。

(3)不可重复读:一个事务对同一行数据重复读取两次,但却得到了不一样的结果,包括:

虚读:事务T1读取某一数据后,事务T2对其作了修改,当事务T1再次读取该数据时得到与前一次不同的值。

幻读:事务在操作过程中进行两次查询,第二次查询的结果包含了第一次查询中未出现的数据或者缺少了第一次查询中出现的数据。这是因为两次查询过程中有另一个事务插入数据造成的。

5.事务4大隔离级别:

(1)读未提交:只更新丢失。允许其他事物看到没提交的数据;则不允许其他事务同时进行写操作,但允许其他事务读。可以通过“排他锁”实现。

(2)读提交:处理更新丢失,脏读。被读取的数据可以被其他事务修改:读取数据的事务允许其他事物继续访问该行数据,但是未提交的写事务将会禁止其他事务访问改行。可以通过“ 瞬间共享读锁”和“排他写锁”实现。

(3)可重复读取:处理更新丢失,脏读和不可重复读取。所有被select获取的数据都不能被修改,这样就可以避免一个事务前后读取数据不一致的情况;读取数据的事务将会禁止写事务,但允许读事务,写事务则禁止任何其他事物。可以通过“ 共享读锁 ”和“ 排他写锁 ”实现。

(4)序列化:提供严格的事务隔离。事务只能一个一个执行,不能并发执行。仅通过“ 行级锁 ”无法实现序列化,必须通过其他机制保证新插入的数据不会被纲脂性的查询操作的事务访问到。

MySQL数据库的默认隔离级别是可重复读。隔离级别越高,月能保证数据的完整性和统一性,但是对并发性能影响也很大。对于大多数的应用程序,可以优先考虑把数据库的隔离级别设为Read Committed(读提交),他能避免脏读,具有较好的并发性,尽管它会导致不可重复读,幻读和第二类丢失更新这些并发问题,在可能出现这类问题的个别场合,可以有应用程序采用悲观和乐观锁来控制。

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