【database】事务 transaction

数据库事务

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

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

  • 脏读(dirty read)

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

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

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

  • 幻读(phantom read)

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

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

  • 原子性(Atomicity)

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

  • 一致性(Consistency)

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

  • 隔离性(Isolation)

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

  • 持久性(Durability)

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

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

Isolation LevelDirty ReadNon-Repeatable ReadPhantom Read
读未提交(Read uncommitted)PossiblePossiblePossible
读已提交(Read committed)Not possiblePossiblePossible
可重复读(Repeatable read)Not possibleNot possiblePossible
序列化(Serializable)Not possibleNot possibleNot possible

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

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

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

锁的限制

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

排它锁(exclusive locks)

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

共享锁(share locks)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值