事务是一组原子性的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 | 否 | 否 | 否 |