MySQL事务的特性和隔离级别

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/Hanoch_wang/article/details/90723633

事务是一组原子性的SQL语句,也可以被看作是一个工作单元。事物内的语句要么全部执行,要么一句也不执行。MySQL提供3个事务型存储引擎:InnoDB、NDB Cluster和Falcon。还有几个第三方引擎也支持事务处理,目前最知名的第三方事务性引擎是solidDB和PBXT.

可以用START TRANSACTION语句开始一个事务,用COMMIT语句提交整个事务,永久地修改数据,或者用ROLLBACK语句回滚整个事务,取消已经做的修改。一个事务SQL的样本如下:

START TRANSACTION;

SELECT * FROM .......;

UPDATE ......;

UPADTE ......;

COMMIT;

一般来说,事务必须满足四个条件(ACID):原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。

原子性(Atomicity):一个事务必须被视为一个单独的内部”不可分“的工作单元。即一组事务要么全部执行,要么全部回滚。

一致性(Consistency):数据库总是从一种一致性状态转换到另一种一致性状态,有非法数据时,事务回滚,任何事务处理过程中所做的数据改变,也不会影响到数据库的内容。

隔离性(Isolation):某个事务的结果只有在完成之后才对其他事务可见。

持久性(Durability):一旦一个事务提交,事务所做的数据改变将是永久的。这意味着数据改变已被记录,即使系统崩溃,数据也不会因此丢失。

ACID兼容的数据库服务器,要为事务处理做大量的复杂工作,确保ACID特性的实现。通常,一个支持ACIDt特性的数据库,相对于不支持这种特性的数据库,需要更强的CPU处理能力、更大的内存和更多的磁盘处理空间。用户可以根据应用是否需要事务处理,选择相应的存储引擎。如果对于某些类型的数据查询,用户不需要真正的事务处理,他可以选择一个非事务处理型的存储引擎来实现查询,以便获得更高的性能。

事务并发不进行事务隔离会造成脏读、不可重复读、幻读

脏读:一个事务(A)读取到另一个事务(B)中未提交的数据,另一个事务中数据可能进行了回滚,此时A事务读取的数据可能和数据库中数据是不一致的,此时认为数据是脏数据,读取脏数据过程叫做脏读。

不可重复读:当事务A第一次读取事务后,事务B对事务A读取的数据进行修改,事务A中再次读取的数据和之前读取的数据不一致,此过程称为不可重复读。主要针对的是某行数据.(或行中某列),操作是修改操作,两次读取在同一个事务内。

幻读:事务A按照特定条件查询出结果,事务B新增了一条符合条件的数据。事务 A 中查询的数据和数据库中的数据不一致的,事务 A 好像出现了幻觉,这种情况称为幻读。 主要针对的操作是新增或删除。

四种隔离级别:

1、READ UNCOMMITTED(提取未提交内容):在READ UNCOMMITTED隔离级,所有事务都可以“看到”未提交事务的执行结果。会出现脏读、不可重复度、幻读。

2、READ COMMITTED(读取提交内容):只能读取其他事务已提交数据,可以防止脏读,可能出现不可重复读和幻读.。

3、REPEATABLE READ(可重复读):读取的数据被添加锁,防止其他事务修改此数据,可以防止不可重复读、脏读,可能出现幻读.

4、SERIALZABLE(可串行化):是最高级别的隔离级,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。可以避免脏读、不可重复读、幻读。 排队操作,对整个表添加锁。

隔离级 脏读可能性 不可重复读可能性 幻读可能性
READ UNCOMMITTED  是
READ COMMITTED
REPEATABLE READ
SERIALZABLE



 

 

猜你喜欢

转载自blog.csdn.net/Hanoch_wang/article/details/90723633