之前一致假设数据库只有一个用户在使用,但是实际情况是 多个用户共享数据库,本书将介绍多用户使用数据库的情况。
在mysql中事务由作为单独单元的一个或多个sql语句组成,这个单元中的每个sql语句是相互依赖的,而且单元作为一个整体是不可分割的。如果单元中的一个语句不能完成,整个单元就会回滚(撤销)。
不是所有的存储引擎都支持事务,innodb和bdb支持,但是myisam和memory不支持,这种系统中的事务只能通过直接的表锁定实现
9.1 事务属性
MySQL事务系统能够完全满足事务安全的acid测试,即原子性(a)、一致性(c)、隔离性(i)、持久性(d)
1. 原子性
每个事务都必须被看作一个不可分割的单元,假设一个事务由两个或多个任务组成,其中语句必须同时成功才能认为整个事务是成功的。如果任务失败,系统将会返回到事务以前的状态。
2. 一致性
不管事务时成功完成还是中途失败,当事务使系统处于一致的状态时存在一致性。例如从员工数据库中删除了一个员工,则所有和该员工相关的数据,包括工资记录、职务变动也要被删除。
3. 隔离性
是指每个事务在它自己的空间发生,和其他发生在系统中的事务隔离,而且事务的结果只有在它完全被执行时才能看到。即使在这样的一个系统中同时发生了多个事务,隔离性原则保证某个特定事物在完全完成之前,其结果是看不见的
4. 持久性
持久性是指即使系统崩溃,一个提交的事务仍然存在,当一个事务完成,数据库的日志已经被更新时,持久性就开始发生作用。
9.2 事务处理
在mysql中,当一个会话开始时,系统变量autocommit值就会为1,即自动提交功能时打开的,当用户每执行一条sql语句后,该语句对数据库的修改就会立即被提交成为持久性修改保存到磁盘上,一个事务也就结束了。因此,用户