【database】事务 transaction

数据库事务

事务是一个包含 一个 或者 多个 SQL 语句的逻辑工作单元。这个工作单元是原子性的,要么全部提交,要么全部回滚。

并发(多用户)带来的问题

  • 脏读(dirty read)

事务读取了 另一个事务写入但未提交的数据。

  • 不可重复读 (non-repeatable read)(也叫模糊读 fuzzy read)

事务再次读取前一次读取的数据,发现另一个已提交的事务 修改或者删除了要读取的数据。

  • 幻读(phantom read)

事务再次执行 查询语句,返回满足条件的一组数据,发现另一个已提交的事务 插入了满足条件的新数据。

数据库事务的四大特性(ACID)

  • 原子性(Atomicity)

事务的原子性是指事务中包含的所有操作要么都执行,要么都不执行,任何一个sql语句执行失败,那么已执行的sql语句也必须撤销,退回到事务前的状态。例如 更新 100条数据为1个事务,但是在更新20个之后系统失败了,那么数据库会将已经更新的20条数据回滚。

  • 一致性(Consistency)

一致性是指数据库在事务操作前和事务处理后,其中的数据必须都满足业务规则约束,比如转账操作中金钱总和要保持一致。

  • 隔离性(Isolation)

在事务提交之前,事务的影响对于其他事务是不可见的。

  • 持久性(Durability)

已提交的事务 所做出的改变是永久性的。

解决并发问题的四种隔离级别

Isolation Level Dirty Read Non-Repeatable Read Phantom Read
读未提交(Read uncommitted) Possible Possible Possible
读已提交(Read committed) Not possible Possible Possible
可重复读(Repeatable read) Not possible Not possible Possible
序列化(Serializable) Not possible Not possible Not possible

oracle 默认使用 读已提交(Read committed)的 隔离级别,同时提供了序列化隔离级别。

mysql 默认使用 可重复读(Repeatable read)的 隔离级别

一般情况下,多用户数据库 使用某种形式的数据锁 解决 数据并发性、完整性 和 一致性 的问题。锁是用来防止 多个用户访问同一个资源而产生破坏性的相互作用的机制。

锁的限制

通常,在多用户数据库中,可以使用 2种级别的锁:

排它锁(exclusive locks)

排它锁 用于防止 关联资源 被分享 从而修改数据。在排它锁释放之前,唯一锁定资源的第一个事务 是 唯一一个可以修改资源的事务。

共享锁(share locks)

 

你可能感兴趣的:(面试,interview,数据库,database)