1.概念
数据库事务( transaction)是访问并可能操作各种数据项的一个数据库操作序列(对增删改查等操作),这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。事务由事务开始与事务结束之间执行的全部数据库操作组成。
2.四大特性
数据库的四大特性也是数据库一般需要满足的4个条件(ACID),他们分别是:原子性(Atomicity,或称不可分割性)、一致性(Consistency)、隔离性(Isolation,又称独立性)、持久性(Durability)。每个特性都有其特定职责。
(1)原子性:一个事务(transaction)要么全部执行,要么全部不执行,不会停止在中间的某个环节。如果事务中途发生错误,也会被回滚(Rollback)回到事务开始前的状态,就像这个事务没有执行一样。
(2)一致性:事务开始前和事务开始后,数据库的完整性不会发生变化。只是一致性的状态发生了(或没发生)改变。
(3)隔离性:数据库允许多个事务同时对其数据进行读写和修改。事物之间不会相互干扰,并且事务执行的中间结果对其他事务必须是透明的。
(4)持久性:事务处理结束后,对数据的修改是永久的,就算出现故障也不会改变。
3.事务的隔离级别
事务的隔离分为不同级别,包括***读未提交(Read uncommitted)***、***读提交(read committed)***、***可重复读(repeatable read)***、***串行化(Serializable)***。
这四种级别分别可以解决不同的问题,下面说一下不使用隔离级别容易出现的问题:
(1)丢失更新(Lost Update):当两个或多个事务选择同一行,然后基于最初选定的值更新该行时,由于每个事务都不知道其他事务的存在,就会发生丢失更新问题 --最后的更新覆盖了由其他事务所做的更新。例如:两个编辑人员制作了同一 文档的电子副本。每个编辑人员独立地更改其副本,然后保存更改后的副本,这样就覆盖了原始文档。 最后保存其更改副本的编辑人员覆盖另一个编辑人员所做的更改。如果在一个编辑人员完成并提交事务之前,另一个编辑人员不能访问同 一文件,则可避免此问题。
(2)***脏读(Dirty Reads)***:一个事务正在对一条记录做修改,在这个事务完成并提交前, 这条记录的数据就处于不一致状态; 这时, 另一个事务也来读取同一条记录,如果不加控制,第二个事务读取了这些“脏”数据,并据此做进一步的处理,就会产生未提交的数据依赖关系。这种现象被形象地叫做"脏读"。
(3)不可重复读(Non-Repeatable Reads):一个事务在读取某些数据后的某个时间,再次读取以前读过的数据,却发现其读出的数据已经发生了改变、或某些记录已经被删除了!这种现象就叫做“不可重复读” 。
(4)幻读(Repeatable Read):幻读是指当事务不是独立执行时发生的一种现象。指一个事务执行两次查询,但第二次查询的结果包含了第一次查询中未出现的数据。
为了避免上述事务并发问题的出现,在标准的 SQL 规范中定义了四种事务隔离级别,不同的隔离级别对事务的处理有所不同。这四种事务的隔离级别如下。
(1)读未提交(Read Uncommitted):一个事务在执行过程中,既可以访问其他事务未提交的新插入的数据,又可以访问未提交的修改数据。如果一个事务已经开始写数据,则另外一个事务不允许同时进行写操作,但允许其他事务读此行数据。此隔离级别可防止丢失更新。
(2)读已提交(Read Committed):一个事务在执行过程中,既可以访问其他事务成功提交的新插入的数据,又可以访问成功修改的数据。读取数据的事务允许其他事务继续访问该行数据,但是未提交的写事务将会禁止其他事务访问该行。此隔离级别可有效防止脏读。
(3)可重复读取(Repeatable Read):一个事务在执行过程中,可以访问其他事务成功提交的新插入的数据,但不可以访问成功修改的数据。读取数据的事务将会禁止写事务(但允许读事务),写事务则禁止任何其他事务。此隔离级别可有效防止不可重复读和脏读。
(4)可串行化(Serializable):提供严格的事务隔离。它要求事务序列化执行,事务只能一个接着一个地执行,不能并发执行。此隔离级别可有效防止脏读、不可重复读和幻读。但这个级别可能导致大量的超时现象和锁竞争,在实际应用中很少使用。
一般来说,事务的隔离级别越高,越能保证数据库的完整性和一致性,但相对来说,隔离级别越高,对并发性能的影响也越大。因此,通常将数据库的隔离级别设置为 Read Committed,即读已提交数据,它既能防止脏读,又能有较好的并发性能。虽然这种隔离级别会导致不可重复读、幻读和第二类丢失更新这些并发问题,但可通过在应用程序中采用悲观锁和乐观锁加以控制。
数据库事务总结
最新推荐文章于 2022-10-19 01:11:07 发布