我们以转账为例。例如张三家的狗生病了,但是张三现在账户上只有20块钱,而给狗看病需要50块钱。那么张三给关系不错的李四打电话了,要李四转账给他30块钱(李四现在账户上有100块钱)。这个转账的过程就需要遵循数据库的一些特性。
原子性(Automicity)
在现实世界中转账是个不可分割的操作。要么转账成功,要么没有转,不存在说转一半的情况。我们把这种要么不做要么全做的规则称之为原子性。
隔离性(Isolation)
在张三向李四转账的操作分别设为t1,t2.在现实环境中t1,t2是没有关系的,先执行t1在执行t2或者是先执行t2在执行t1都是一样的。
但是在数据库中t1,t2的操作是交替执行的。有可能出现在写完t1中李四的账户余额后,t2操作在读取李四账户的值时,李四账户的余额由100元变为了70元。那李四最后的账户余额则变为了40元,这样就造成了转账的混乱。所以在数据库中不仅要保证操作以原子性的方式完成操作,而且还要保证其他的状态转换不收本次状态转换的影响,这个规则被称之为隔离性。
一致性(Consistency)
在转账过程中参与转账的账户总的金额是不变的,这个规则就称之为一致性。数据库中某些操作的原子性和隔离性都是保证一致性的一种手段,但是也不是说原子性和隔离性的操作就一定满足一致性,比如说举个极端的例子,张三向李四借了200元。他满足了原子性和隔离性的操作,但是李四自己本身的账户却只有100块钱。综上所述,一致性的操作一定是满足原子性和隔离性的,但是原子性和隔离性的操作并不一定满足一致性。
持久性(Durability)
在一个转态转换完成后,这个操作的结果将永久的保留在数据库的表中。这个规则被称之为持久性。
事务的概念:
我们把需要保证原子性(Automicity)、隔离性(Isolation)、一致性(Consistency)和持久性(Durability) ACID的一个或多个数据库操作称之为一个事务(transaction)。
mysql中事务的语法
开启事务
begin [work];
begin语句代表开启一个事务,后边的work可有可无。事务开始后,可以写若干条语句。这些语句都属于刚开始的事务。
start transaction;
start transaction和begin一样,有类似的作用。不过与begin不同的是start transaction可以在后面加修饰符进行修饰。
READ ONLY: 标识当前事务只是一个只读事务,也就是说该事务只能进行读取操作,不能对数据进行修改。
READ WRITE:标识当前事务是一个读写事务,也就是说该事务既能读取数据,也能修改数据。(read only 和read write不能同时使用,不能同时设置为只读也设置为读写的)
WITH CONSISTENT SNAPSHOT:启动一致性读;
如果想在start transaction后面加多个修饰语的话,可以写成这样:
start transaction read only,with consistent snapshot;
READ WRITE也可以以同样的方式添加,但是需要注意的是不能将事务既设置为只读,也设置为读写。二者之间只能取其中的一个方式。
提交事务
在事务中需要写的语句写完后,我们就需要提交事务了,事务的提交方式可以写成这样:
commit [work];
回滚事务
在事务中写完语句后发现,写过的某一条语句在逻辑上有问题,可以使用回滚的方式将数据恢复到事务执行之前的状态:
rollback [work];
rollback语句代表回滚一个事务,work可有可无。
并不是所有存储引擎都支持事务的功能,mysql目前只有Innodb和NDB存储引擎支持。如果在某个事务中含有不支持存储引擎的表,那么事务就无法对修改过的表进行提交和回滚。