日期:2014-05-16  浏览次数:20788 次

MySQL心得10-1--事务

1. 在MySQL环境中,事务由作为一个单独单元的一个或多个SQL语句组成。这个单元中的每个SQL语句是互相依赖的,而且单元作为一个整体是不可分割的。如果单元中的一个语句不能完成,整个单元就会回滚(撤销),所有影响到的数据将返回到事务开始以前的状态。因而,只有事务中的所有语句都成功地执行才能说这个事务被成功地执行。

2.并不是所有的存储引擎都支持事务,如InnoDB和BDB支持,但MyISAM和MEMORY不支持。

通过InnoDB和BDB表类型,MySQL 事务系统能够完全满足事务安全的ACID测试。旧的表类型,如MyISAM类型,不支持事务。因此,这种系统中的事务只能通过直接的表锁定实现。

术语“ACID”是一个简称,每个事务的处理必须满足ACID原则,即原子性:A(atom)、一致性:C(consistent)、隔离性:I(independence)、持久性:D(durability)。

(1)原子性

原子性意味着每个事务都必须被认为是一个不可分割的单元。假设一个事务由两个或者多个任务组成,其中的语句必须同时成功才能认为事务是成功的。如果事务失败,系统将会返回到事务以前的状态。

在添加雇员这个例子中,原子性指如果没有创建雇员相应的工资表和部门记录,就不可能向雇员数据库添加雇员。

原子的执行是一个或者全部发生或者什么也没有发生的命题。在一个原子操作中,如果事务中的任何一个语句失败,前面执行的语句都将返回,以保证数据的整体性没有受到影响。这在一些关键系统中尤其重要,现实世界的应用程序(如金融系统:转账)执行数据输入或更新,必须保证不出现数据丢失或数据错误,以保证数据安全性。

(2)一致性

不管事务是完全成功完成还是中途失败,当事务使系统处于一致的状态时存在一致性。参照前面的例子,一致性是指如果从系统中删除了一个雇员,则所有和该雇员相关的数据,包括工资数据和组的成员资格也要被删除。

在MySQL中,一致性主要由MySQL的日志机制处理,它记录了数据库的所有变化,为事务恢复提供了跟踪记录。如果系统在事务处理中间发生错误,MySQL恢复过程将使用这些日志来发现事务是否已经完全成功地执行,是否需要返回。因而一致性属性保证了数据库从不返回一个未处理完的事务

(3)隔离性

隔离性是指每个事务在它自己的空间发生,和其他发生在系统中的事务隔离,而且事务的结果只有在它完全被执行时才能看到。即使在这样的一个系统中同时发生了多个事务,隔离性原则保证某个特定事务在完全完成之前,其结果是看不见的。

当系统支持多个同时存在的用户和连接时(如MySQL),这就尤其重要。如果系统不遵循这个基本规则,就可能导致大量数据的破坏,如每个事务的各自空间的完整性很快地被其他冲突事务所侵犯。

获得绝对隔离性的唯一方法是保证在任意时刻只能有一个用户访问数据库。当处理像MySQL这样多用户的RDBMS时,这不是一个实际的解决方法。但是,大多数事务系统使用页级锁定或行级锁定隔离不同事务之间的变化,这是要以降低性能为代价的。例如,MySQL的BDB表处理程序使用页级锁定来保证处理多个同时发生的事务的安全,InnoDB表处理程序使用更好的行级锁定。

(4)持久性

持久性是指即使系统崩溃,一个提交的事务仍然存在。当一个事务完成,数据库的日志已经被更新时,持久性就开始发生作用。大多数RDBMS产品通过保存所有行为的日志来保证数据的持久性,这些行为是指在数据库中以任何方法更改数据。数据库日志记录了所有对于表的更新、查询、报表等。

如果系统崩溃或者数据存储介质被破坏,通过使用日志,系统能够恢复在重启前进行的最后一次成功的更新,反映了在崩溃时处于过程的事务的变化。

MySQL通过保存一条记录事务过程中系统变化的二进制事务日志文件来实现持久性。如果遇到硬件破坏或者突然的系统关机,在系统重启时,通过使用最后的备份和日志就可以很容易地恢复丢失的数据。

默认情况下,InnDB表是100%持久的(所有在崩溃前系统所进行的事务在恢复过程中都可以可靠地恢复)。MyISAM表提供部分持久性所有在最后一个FLUSH TABLES命令前进行的变化都能保证被存盘。

3.事务是由一组SQL语句构成的,它由一个用户输入,并以修改成持久的或者滚到原来状态而终结。

在MySQL