dos啥也不会

以需求为导向学习

sql事务隔离

sql事务相关的笔记,主要是我自己的一些理解

事务的特性,以及我的理解

一般而言,事务有以下四个特性:原子性,隔离,持久性,一致性
我个人认为一致性不属于事务的特性,而是事务的目标.为了达到一致性的目标,需要使用到其他一些特性来支撑,比如:原子性,隔离,持久性
而具有这三个特性的东西被称为事务

事务的隔离

事务的原子性和持久性都比较好理解,原子性保证了一组有关联的操作要么全部成功要么全部失败,避免脏数据的产生.持久性保证了操作结果不会因为系统崩溃而丢失.这两个特性针对的都是某一个事务,
但是事务的隔离针对的是多个事务.按照定义来看事务的隔离应该是严格的,也就是说事务之间的操作是相互独立的,每个事务是看不到其他事务的操作的.但是这与实际生活的经验不符.
一个简单的例子,A B两个人同时抢购一个商品.按照事务严格隔离来看,A和B的事务是相互独立的,那么就会发生A B各自打开商品连接,此时A付款,B刷新页面,仍然显示商品数量剩余1件.但是实际A和B的事务之间是不独立的,如果A付款,B刷新页面,B看到是库存应该是0
这个例子表明在某一个事务结束之后,其他事务应该可以看到到该事务的更新.因此事务的隔离便有了等级之分,一般将事务的隔离分为四个等级:

  • 读未提交(Read Uncommitted):一个事务可以读取和修改其他事务未提交的数据,相当于放弃了事务控制
  • 读已提交(Read Committed):一个事务可以读取和修改其他事务已提交的数据,符合大多数实际场景
  • 可重复读(Repeatable Read):一个事务只能读取和修改在创建事务后第一次读取到的数据,符合一般人的理解.但是可能不符合部分实际场景
  • 可串行化(Serializable):使用锁,保证了事务间的数据操作互不冲突,但是基本等同于放弃了多线程,效率较低,但是能最好的保证数据一致性