数据库系统原理

事务四大特性:

          原子性(Atomicity)

          一致性(Consistency)

          隔离性(Isolation)

           持久性(Durability)



并发一致性问题:

丢失修改:两事务都修改一个值,一个修改完后,另一个立即有修改了,造成第一个修改丢失。

读脏数据:T1事务读取了T2事务修改但未提交的数据,后续T2被回滚了。

不可重复读(幻读):T1读数据两次,第一次读取后,数据被T2修改了,第二次再读,两次数据不一致。



封锁:

        MySQL 中提供了两种封锁粒度:行级锁以及表级锁。

           应该尽量只锁定需要修改的那部分数据,而不是所有的资源。锁定的数据量越少,发生锁争用的可能就越小,系统的并发程度就越高。但是加锁需要消耗资源,锁的各种操作(包括获取锁、释放锁、以及检查锁状态)都会增加系统开销。因此封锁粒度越小,系统开销就越大。在选择封锁粒度时,需要在锁开销和并发程度之间做一个权衡。

1. 读写锁

    互斥锁(Exclusive),简写为 X 锁,又称写锁。(自己独占,其他事务不可操作)

    共享锁(Shared),简写为 S 锁,又称读锁。(其他事务可读,但是都不可写(包括自己))


封锁协议

1. 三级封锁协议

    一级封锁协议

    事务 T 要修改数据 A 时必须加 X 锁,直到 T 结束才释放锁。可以解决丢失修改问题.

    二级封锁协议

    在一级的基础上,要求读取数据 A 时必须加 S 锁,读取完马上释放 S 锁。可以解决读脏数据问题。(先是加了X锁,释放之后再加S锁,读完立即释放,此时事务不一定完成)

    三级封锁协议

    在二级的基础上,要求读取数据 A 时必须加 S 锁,直到事务结束了才能释放 S 锁。可以解决不可重复读的问题。


隔离级别

未提交读(READ UNCOMMITTED) 

                事务中的修改,即使没有提交,对其它事务也是可见的。

  提交读(READ COMMITTED)

                一个事务只能读取已经提交的事务所做的修改。换句话说,一个事务所做的修改在提交之前对其它事务是不可见的。

可重复读(REPEATABLE READ)

                保证在同一个事务中多次读取同一数据的结果是一样的。

可串行化(SERIALIZABLE)

                强制事务串行执行,这样多个事务互不干扰,不会出现并发一致性问题。

多版本并发控制(Multi-Version Concurrency Control, MVCC)是 MySQL 的 InnoDB 存储引擎实现隔离级别的一种具体方式,用于实现提交读和可重复读这两种隔离级别。而未提交读隔离级别总是读取最新的数据行,要求很低,无需使用 MVCC。可串行化隔离级别需要对所有读取的行都加锁,单纯使用 MVCC 无法实现。


范式

1. 第一范式 (1NF)

        属性不可分。

2. 第二范式 (2NF)

        每个非主属性完全函数依赖于键码。

3. 第三范式 (3NF)

        非主属性不传递函数依赖于键码。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容