欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

数据库之事务

程序员文章站 2024-01-14 09:58:58
...

事务:

   

事务象征着一个工作单元,也就是操作序列。这些操作要么都执行,要么都不执行。在每个事务结束时,都保持数据的一致性。

 由此衍生出了事务的四个特性:ACID;

  •   原子性(Atomicity)事务是一个不可分割的操作。一系列的操作要么都完成,要么都不完成。
  • 一致性(Consistency) 保证在事务前和事务结束后,数据库的完整性约束没有被破坏。
  • 隔离线(Isolation) 保证了事务与事务之间是透明的,互不干扰的。
  • 持久性(Durability) 保证了事务提交的结果能被永久保存下来。

事务语句:

 开始事务:BEGIN TRANSACTION;

 提交事务:COMMIT TRANSACTION;

回滚事务:ROLLBACK TRANSACTION;


数据库并发产生的问题

  • Lost updates(更新丢失)
  • Dirty read(脏读)
  • Unrepeatable read(不可重复读)

更新丢失:指在两个事务访问相同的数据库数据时,那么其中一个事务的结果会把另一个事务的结果覆盖。

例如:

 Transaction-A

Time Transaction-B
--- t0 ----
Read X t1    ----
---- t2 ReadX
Update X t3 ----
--- t4 UpdateX
---- t5 ----

事务B的更新导致了事务A的更新丢失。

脏读:事务A读取到了事务B尚未提交的数据。该数据有可能会因为回滚从而失效。那么有造成错误的隐患。

 

Transaction-A Time Transaction-B
--- t0 ---
--- t1 Update X
Read X t2 ----
--- t3 Rollback
--- t4 ---


 不可重复读:一个事务对同一行数据读取了两次,得到不同的结果:具体分为两种情况:

 1.虚读:事务1在对同一记录读取两次的过程中,事务2对该记录进行了修改,从而事务1第二次读到不一样的记录;

 2.幻读:事务1在两次查询的过程中,事务2对表进行了修改,更新操作,从而事务1的两次查询的结果是不一样的;

tips:脏读是指读到了尚未提交事务的数据,而不可重复读是读到提交事务的数据

事务隔离级别:

程度  描述

Level0

(Read uncommited)读未提交


在该级别下,一个事务对一行数据的修改过程中,不允许其他事务对该行数据进行修改,但允许其他事务对它进行读操作。在该级别下可以避免更新丢失,但是不能避免脏读和不可重复读。

Level 2

(Read commited)

读提交

在该级别下,未提交的写事务不允许其他事务访问该行数据。因此不会出现脏读。但是读事务允许其他事务访问该行数据。

因此会出现不可重复读的情况

Level3

(Repeatable read)重复读

在该级别下,读事务禁止写事务,但允许读事务,因此不会出现同一事物两次读到不同数据的情况(既可以避免不可重复读),并且写事务禁止其他一切事务。

Level4

(Serializable)序列化

要求所有的事务都必须串行执行,因此能避免一切并发引起的问题。但是效率很低。

使用事务时需要注意的事情:

  •  不要在循环中提交事务
  • 不要使用自动提交
  • 不要使用自动回滚
  • 不要使用长事务

友情链接:

数据库事务详解

Transaction Processing

相关标签: 事务