3. 数据库事务

我们在开发数据库应用时,会遇到类似以下的场景:

假设有个表users(id pk,name,age,sex)用于存放用户信息,有个表blogs(id pk, user_id fk, title, content)用于存放用户记录的博客信息,blogs的user_id字段记录博客拥有者的id。

现在,我们需要删除某个用户,当然我们也会连同删掉其的博客信息

delete from users where id = 100;
delete from blogs where user_id = 100;

我们可能会遇到删除出错的情况:删除了用户信息,但是删除其博客信息出错,那么这些博客就成了无主的!

所以我们希望这2个语句的执行过程符合:要么全做,要么全不做。


数据库事务Transaction就是解决这个问题的利器(当然有人会说, 使用级联删除,以后再讲)

什么是事务?是指作为单个逻辑工作单元的一系列操作,要么完全地执行,要么完全地不执行。

一个逻辑工作单元要成为事务,必须满足ACID属性:

1. A->Atomicity, 原子性: 事务必须是原子工作单元,整个事务中的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节;

2. C->Consistency,一致性: 事务必须始终保证系统数据处于一致的状态,不管在任何给定的时间并发事务有多少;

3.I->Isolation,隔离性:  由并发事务所做的修改必须与任何其他并发事务所作的修改相互隔离,事务查看数据时数据所处的状态,要么是另一并发事务修改它之前的状态,要么是另一并发事务修改它之后的状态,事务不能查看中间状态的数据。当事务可序列化时(即串行)可以获得最高的隔离界别,但是势必会降低系统处理事务的吞吐量;

4.D->Durability,持久性: 事务完成之后,它对于系统所作的修改应该是持久性的,即使系统出现故障也将一直保持。


在Mysql中InnoDB存储引擎是支持事务的,Myisam存储引擎则不支持, 以下针对InnoDB而言:

Mysql默认情况下,是自动提交事务的,也即每当我们执行一个查询都会被当做一个事务自动执行,针对最上面的场景我们可以通过2个方法来解决:

1. 关闭自动提交(session级别), 每次执行单个逻辑工作单元后,手动commit提交/rollback回滚

set autocommit=0;
delete from users where id = 100;
delete from blogs where user_id = 100;
commit;
2. 使用begin(或者start transaction)显示开启一个事务,然后使用commit提交,或者rollback回滚
begin;
delete from users where id = 100;
delete from blogs where user_id = 100;
commit;



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值