事物的四大特性、四大隔离级别

1 什么是事物

  定义: 事物就是数据库执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成。
  本质: 由一个或多个sql语句组成。这些sql语句在执行过程中被当作一个整体,要么全部的sql语句执行成功,要么全部失败。不存在一部分执行成功,一部分执行失败。

2 事物的四大特性

2.1 原子性(Atomicity)

  原子性就是将事物进行的操作捆绑成一个不可分割的单元,事物中进行的数据操作要么全部成功,要么全部失败(回滚)。

2.2 一致性(Consistency)

  一致性是指事物使数据库从一个一致性状态转换到另一个一致性状态。也就是数据库前后必须处于一致性状态。
  拿转账来说,假设用户A和用户B两者的钱加起来一共是5000,那么不管A和B之间如何转账,转几次账,事务结束后两个用户的钱相加起来应该还得是5000,这就是事务的一致性。

2.3 隔离性(Isolation,又称独立性)

  多个用户并发访问数据库,数据库为每个用户开启一个事物,每个事物相互独立,互不干扰。
  事务的隔离性主要规定了各个事务之间相互影响的程度。隔离性概念主要面向对数据资源的并发访问(Concurrency),并兼顾影响事务的一致性。当两个事务或者更多事务同时访问同一数据资源的时候,不同的隔离级别决定了各个事务对该数据资源访问的不同行为。
  事务的隔离级别,隔离程度按照从弱到强分别为“Read Uncommitted (未提交读)”,“Read Committed(提交读)”,“Repeatable Read(可重复读)”和“Serializable(序列化)”。

2.4 事务的持久性(Durability)

  持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。

3 不考虑隔离性会发生的问题

  在实际应用中,数据库的事务有两种,读事务(select),修改事务(update,insert)。在没有事务控制的时候,多个用户同时操作相同的数据时,可能会产生并发问题,基本上归结为4中问题。

  1.数据丢失:两个更新事务同时修改一条数据时,会造成数据的丢失。
  2.脏读:脏读是指在一个事务处理过程里读取了另一个未提交的事务中的数据。
  3.不可重复读:不可重复读是指在对于数据库中的某个数据,一个事务范围内多次查询却返回了不同的数据值,这是由于在查询间隔,被另一个事务修改并提交了。例如事务T1在读取某一数据,而事务T2立马修改了这个数据并且提交事务给数据库,事务T1再次读取该数据就得到了不同的结果,发送了不可重复读。
  4.幻读/虚读:幻读是事务非独立执行时发生的一种现象。例如事务T1对一个表中所有的行的某个数据项做了从“1”修改为“2”的操作,这时事务T2又对这个表中插入了一行数据项,而这个数据项的数值还是为“1”并且提交给数据库。而操作事务T1的用户如果再查看刚刚修改的数据,会发现还有一行没有修改,其实这行是从事务T2中添加的,就好像产生幻觉一样,这就是发生了幻读。

3.1 区别

  1.不可重复读和脏读的区别是,脏读是某一事务读取了另一个事务未提交的脏数据,而不可重复读则是读取了前一事务提交的数据。
  2.幻读和不可重复读都是读取了另一条已经提交的事务(这点就脏读不同)。所不同的是不可重复读查询的都是同一个数据项,而幻读针对的是一批数据整体(比如数据的个数);不可重复读是指读到了已经提交的事务的更改数据(修改),幻读是指读到了其他已经提交事务的新增或删除数据。
  3.解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表。

4 事务的隔离级别

4.1 Read uncommitted (读未提交)

  如果一个事务A已经开始写数据,则另一个事务B不允许写操作。但是可以读取这个事务A修改但未提交的数据。最低级别,任何情况都无法保证。

4.2 Read Committed (读已提交)

  事务A只能读取事务B修改并且提交后的数据行,禁止访问事务B处于写状态的数据行。可以避免脏读。

4.3 Repeatable Read(可重复读取)

  事务A在读取数据行时,禁止其他事务对该数据行进行更改,但是可以进行读取操作。进行写操作时,禁止其他事务的任何操作。可以防止脏读和不可重复读。

4.4 Serializable (可串行化)

  提供严格的隔离级别,要求事务一个个的执行。不能并发执行。有效的防止脏读,不可重复读,幻读。

5 mysql与oracle的区别

  1. mysql支持4中隔离级别,且自动提交,其中默认的隔离级别是repeatable read。
  2. 在mysql中查看当前的隔离级别,select @@tx_isolation;
  3. 在mysql中设置数据库的隔离级别,set tx_isolation=‘隔离级别名称’,一定要在开启事务之前,设置隔离级别。如果通过jdbc设置事务的隔离级别,也要在开启事务代码前,写上隔离级别代码。
  4. oracle支持两种隔离级别(read committed,serializable),需要手动提交,默认的隔离级别是read committed。
发布了39 篇原创文章 · 获赞 5 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/a1920135141/article/details/101051666