事务:由多个原子操作组成,所谓原子操作即单个操作和功能,该操作会立即执行。

事务处理流程:

1、关闭自动提交功能

2、开启事务处理模块

3、事务处理(成功-》提交,失败-》回滚)

4、重新开启自动提交功能


以数据库mysql为例,目前mysql支持事务的数据库(表)引擎常用的是innodb,而在数据库中可以存在多中不同的表引擎的表,故pdo默认是自动提交的原子操作。事务处理为多原子的结合操作,所以在需使用pdo事务处理时需关闭自动提交功能。

 

 

添加:2015-07-21

事务包含四个特点即ACID:

  1. 原子性(atomicity):一个事务必须被视为一个不可分割的最小工作单元,整个事务的操作要么全做,要么全不做。

  2. 一致性(consistency):数据库总是从一个一致性状态转换到另一个一致性状态。

  3. 隔离性(isolation):一个事务所做的修改在提交之前对其他事务是不可见的。

  4. 持久性(durability):一旦事务提交成功,则其所做的修改就会永久保存到数据库中。


mysql服务器层并不管理事务,事务是由下层的存储引擎实现的。通常支持事务的存储引擎需要更多的系统资源,如:更强的cpu处理能力,更大的内存和外存空间等等。所以,对于一些不需要的事务的查询类应用,选择一个非事务存储引擎,可以获得更高的性能。

 

上面提到关于关闭自动提交功能,如果对于非事务型的表(myisam或内存表)而言,则不会产生任何影响。

如果在事务中混合使用了非事务型表,在事务正常提交的情况下不会有什么问题,但如果提交失败,事务回滚对于非事务型表而言往往会失败,造成数据库处于不一致状态,事务的结果往往很难预料。在应用到事务时,应注意选择合适的存储引擎。

 

死锁问题:

对于操作系统而言:应用程序之间的进程(或线程)争夺资源也可能会陷于死锁状态。操作系统在进程执行期间对它进行检测,划定安全区。如果进程进去非安全区且发生死锁现象,通常则会回退(杀死)占用资源的死锁进程,而这个判断准则则是根据进程的重要性来做出抉择。产生死锁的根本原因是系统的资源(处理器资源,寄存器资源等等)不够。

对于mysql服务器来说,它的死锁是由于出现了事务,事务在处理过程中会锁定资源,拒绝其他事务访问该资源,而其他事务又必须等待该资源,由于产生相互等待,便陷于死锁。在死锁发生后,通常回滚一个事务,然后重新执行即可。这个事务的判断准则则是将最少持有行级排他锁的事务回滚(innodb存储引擎为例)。