数据库事务
事务是一个包含 一个 或者 多个 SQL 语句的逻辑工作单元。这个工作单元是原子性的,要么全部提交,要么全部回滚。
并发(多用户)带来的问题
- 脏读(dirty read)
事务读取了 另一个事务写入但未提交的数据。
- 不可重复读 (non-repeatable read)(也叫模糊读 fuzzy read)
事务再次读取前一次读取的数据,发现另一个已提交的事务 修改或者删除了要读取的数据。
- 幻读(phantom read)
事务再次执行 查询语句,返回满足条件的一组数据,发现另一个已提交的事务 插入了满足条件的新数据。
数据库事务的四大特性(ACID)
- 原子性(Atomicity)
事务的原子性是指事务中包含的所有操作要么都执行,要么都不执行,任何一个sql语句执行失败,那么已执行的sql语句也必须撤销,退回到事务前的状态。例如 更新 100条数据为1个事务,但是在更新20个之后系统失败了,那么数据库会将已经更新的20条数据回滚。
- 一致性(Consistency)
一致性是指数据库在事务操作前和事务处理后,其中的数据必须都满足业务规则约束,比如转账操作中金钱总和要保持一致。
- 隔离性(Isolation)
在事务提交之前,事务的影响对于其他事务是不可见的。
- 持久性(Durability)
已提交的事务 所做出的改变是永久性的。
解决并发问题的四种隔离级别
oracle 默认使用 读已提交(Read committed)的 隔离级别,同时提供了序列化隔离级别。
mysql 默认使用 可重复读(Repeatable read)的 隔离级别
锁
一般情况下,多用户数据库 使用某种形式的数据锁 解决 数据并发性、完整性 和 一致性 的问题。锁是用来防止 多个用户访问同一个资源而产生破坏性的相互作用的机制。
锁的限制
通常,在多用户数据库中,可以使用 2种级别的锁:
排它锁(exclusive locks)
排它锁 用于防止 关联资源 被分享 从而修改数据。在排它锁释放之前,唯一锁定资源的第一个事务 是 唯一一个可以修改资源的事务。
共享锁(share locks)