事务的特性(ACID)

事务的特性(ACID)

1、原子性(Atomicity)

一次事务中如果进行多个数据操作的业务,最终的结果要么所有操作都成功,要么所有操作都失败

2、一致性(Consistency)

一致性就是数据表中的数据更新要求合乎逻辑的特性,满足原子性不一定满足一致性

3、隔离性(Isolation)

隔离性是当多个用户并发访问数据库时,比如同时操作一一条数据,数据库为每一个用户开启的事务(为该数据上锁,其他事务在上一个事务操作完毕之前不能操作数据的),不能被其他事务的的操作所干扰,多个并发事务事务之间要相互隔离

4、持久性(Durability)

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

没有隔离性会发生的问题

一、更新丢失

1、第一类丢失更新:

事务A撤销时,把已经提交的事务B更新的数据覆盖了

2、第二类丢失更新

事务A覆盖事务B已经提交的数据,造成事务B所做的操作丢失

解决方法:对行枷锁,只允许并发一个更新事务

二、脏读

脏读是指在一个事务处理过程中读取了另一个事务未提交的数据(即将回滚的数据)

解决办法:如果在第一个事务提交前,任何其他事务不可读其修改过的值,则可以避免

三、不可重复读

一个事务对同一行数据重复读取两次,但却得到了不同的结果。事务T1读取某一数据后,事务T2对其做了修改。当T1再次读取数据时得到与之前的结果不一致

解决:如果只有在修改事务完全提交之后才可以读取数据,则可以避免该问题

脏读和不可重复读的区别:

脏读是某一事务读取了另一事务未提交的的脏数据(即将回滚的数据),不可重复读是读取了前一事务提交(更新的)的数据。

4、虚度

同一个事务两次统计一张数据表的数据得到的结果不一致,第二次会增加一数据行

解决:如果在操作事务完成数据处理之前,任何其他事务不可以添加新数据可以避免该问题

幻读和不可重复读的区别

幻读(虚读):一个事务在两次统计某张表的时候,发现最终的统计结果不一致

不可重复的:一个事物两次读取同一条数据,两次的读取结果不一致

事务的隔离级别

1、Read uncommitted(读未提交)

如果一个事务已经开始写数据,则另一个事务则不允许同时进行写操作,但允许其他事务读此行数据。(排他写锁),避免了更新丢失,却可能出现脏读。

2、Read committed(读提交)

如果一个读事务(线程),则允许其他事务读写;如果是写事务将会禁止其他事务访问该行数据。该隔离避免了脏读,但却可能出现不可重复读。

解决了更新丢失和脏读问题

3、Repeatable read(可重复读取)

在一个事务内,多次读取同一数据。在这个事务还没有结束后,其他事务不能访问该数据(包括读写)。这样就保证在一个事务内两次读取的数据是一样的。

读取数据的事务将会禁止写事务(但允许读事务),写事务则禁止任何其他事务(包括读写)。避免了不可重复读取和脏读,但是可能出现幻读。

(读取数据的事务,可以通过“共享读锁”排他写锁实现)

解决了更新丢失,脏读,不可重复读,但可能出现幻读。

4、Serializable(可序列化)

事务只能一个接着一个地执行但不能并发执行。序列化是*的事务隔离级别,但性能低,很少使用。可以避免上述各情况

在MySQL数据库中默认为Repeatable read;在Oracle中只支持Serializable级别和Read committed。默认为Read committed

上一篇:mysql事务(ACID)


下一篇:数据库事务ACID四大特性:原子性、一致性、隔离性、持久性。