浅谈对事务(transaction)的理解

我们以转账为例。例如张三家的狗生病了,但是张三现在账户上只有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存储引擎支持。如果在某个事务中含有不支持存储引擎的表,那么事务就无法对修改过的表进行提交和回滚。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值