15-mysql数据事务语言DTL

事务控制语言(DTL)

mysql数据事务控制语言DTL(Data Transaction Language) 。

什么是事务

通常,一条语句使用一个分号(;)来结束,并得到执行。这个“一次性执行”的过程,可以称为“一个事务”。

简单来说,“一条sql语句,就是一个事务”。

则数据库(包括mysql数据库)中的事务,是指可以将“多条语句”的执行,当作“一条语句”来看的一种内部机制。

即“事务”是一种可以保证“多条语句一次性执行完成”或“一条都不执行”的机制。

将一系列的sql语句当作“一句”来执行的一种机制——该系列语句要么全部执行成功,要么一个都不执行。

为什么需要事务

实际应用中,经验中的一个“操作”,其实常常对应着数据库(表)的2个或2个以上的操作,此时就应该让此2个操作具有“整体性”。

比如网银汇款,其实是将一个储户中的钱减少一个数目,再将另一个储户的钱增加一个数目。

如果只做完了前者,后者因为某种原因没有做完就出错了。

id账户名存款
1test11000
2test25000
3test33000

例如现在,test1向test2银行转账4000:

第一步: update cunkuan set 存款=存款-4000 where id=1;

第一步做完,突然断电了!第二步没有来得及做。

第二步: update cunkuan set 存款=存款+4000 where id=2;

如果没有事务,就可能发生这种事情。如果有了事务,则就可以避免该事情。

事务可以看作是一个“容器”,将多条语句,放入该容器,最后,只要一个命令行,来决定其中的所有语句是否“执行”。

事务的特点

原子性

一个事务中的所有语句,应该做到:要么全做,要么一个都不做;

一致性

让数据保持逻辑上的“合理性”,比如:一个商品出库时,既要让商品库中的该商品数量减1,又要让对应用户的购物车中的该商品加1;

隔离性

如果多个事务同时并发执行,但每个事务就像各自独立执行一样。

持久性

一个事务执行成功,则对数据来说应该是一个明确的硬盘数据更改(而不仅仅是内存中的变化)。

事务模式

事务模式:就是让每条执行语句是否当作“一个事务”来看的设定项。

mysql默认安装好之后,其事务模式是:一条语句(以语句结束符作为标志)就当作一个事务来执行。

查看模式:

show variables like '%autocommit%';

将autocommit设置为0就关闭了该模式,则所有语句都必须使用commit之后才正式生效:

set autocommit = 0;

比如:

原来数据:在这里插入图片描述

执行插入:在这里插入图片描述

结果:在这里插入图片描述

现在将其修改为:事务需要“认可”模式:

set  autocommit = 0;

# false,关闭该模式,即此时不再是一条语句一个事务了。
# 结果是:必须使用commit语句才能够生效。

在这里插入图片描述

然后插入:在这里插入图片描述

刷新:在这里插入图片描述
可见,没有变化。

然后再执行commit:在这里插入图片描述

再刷新:在这里插入图片描述

注意:autocommit的设置值,只是影响通常情况下每条语句的默认行为(自动提交还是等着commit提交)。

不管autocommit的值是什么(1,0),仍然可以使用事务的完整流程模式来实现事务。

事务的基本实现流程

事务的执行基本流程:

  1. 开始事务,声明事务开始:

    start transaction;
    # 或:
    begin;
    
  2. 设定多条要执行的具体的sql语句1,语句2,比如:insert, update, delete, select等,其实就是执行,只是这些执行的语句,并不“生效”——其只是内存状态下的执行,而不是物理状态的执行。

  3. 判断上述语句是否发生错误(cmd中直接观察是否出错,php程序中通过语句的返回结果是否为false或者使用 mysql_error()函数判断是否有错)

    是否需要执行该些语句:

    if(判断是否有错误){
       // 执行——才针对执行了物理性改变——即生效。
       // 如果没有错误,执行commit语句
       commit;
       }
    else {
       // 回滚——不执行任何语句。
       // 否则执行rollback语句
       rollback;
    }
    

下面来使用事务完整实现转账这件事情(假设为cmd模式):

start  transaction;

# 第一步: 
update  cunkuan  set 存款=存款-4000  where id=1;

# 第一步做完,突然断电了?

# 第二步: 
update  cunkuan  set 存款=存款+4000  where id=2;

# 则如果这两条语句都没有错误,就可以:
commit;

# 如果其中发生了错误,则可以:
rollback;

示例:
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值