为什么要用mysql事务?

LiveAsaMonster 2011-11-24 10:50:37
最近公司项目很多地方用到了mysql的事务,比如一条数据的删除,先删主表数据,再删两个明细表数据,这其中就用到了事务处理,为什么要这样用呢?回滚的具体含义是什么?为什么只要有失败操作的时候程序就会自动回滚?这样做有什么好处?

function delete_dj($id) {
$ret = $this->get_row($this->_table, array('Id'=>$id));
if ($ret['status'] < 0) {
return $this->format_ret(NODATA);
}
//开始事务
$this->db->trans_begin();
try {
$ret = $this->delete($this->_table, array('Id'=>$id));
if ($ret['status'] < 0) throw new Exception('delete dj failed!');

$ret = $this->delete($this->_table.'mi', array('p_id'=>$id));
if ($ret['status'] < 0) throw new Exception('delete djmi failed!');

$ret = $this->delete($this->_table.'mx', array('dj_id'=>$id));
if ($ret['status'] < 0) throw new Exception('delete djmx failed!');
$this->db->trans_commit();
$status = SUCCESS;
} catch (Exception $e) {
$this->db->trans_rollback();
$status = ERROR;
}

return $this->format_ret($status);
}
...全文
493 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
coosh 2011-11-25
  • 打赏
  • 举报
回复
同时更新多个记录,但其中一个更新失败,则全部退回到更新操作开始之前。
只有全部更新成功,才确认写入DB。

好比转账:别人转钱给你,先扣减掉ta的转帐款,再加到你的余额。
假如在加你余额时发生错误,则回滚到转账前的状态,返回错误并提示用户转账不成功。
仅当大家的更新都成功是,才确认写到数据库中,返回true并提示用户转账已完成。

都是基本概念
码无边 2011-11-25
  • 打赏
  • 举报
回复
要么执行的多个操作全部执行,要么都不执行。
helloyou0 2011-11-24
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 liveasamonster 的回复:]

有点意思,但是程序是如何回滚的还是不明白,
PHP code

$this->db->trans_rollback();


这句是php干的还是mysql干的呢?
[/Quote]

这句是php...但是php也是调用mysql的api完成具体的回滚.

8楼问为什么要写rollback,
是这样的,在数据库发生突然事件,比如mysql当了,服务器断电了,机房爆炸了,地球毁灭了.....mysql是会自动回滚
但是如果你要自己对事务进行控制,当然要自己rollback,
比如,转A的钱到B账上, A-100后,发现B账户刚刚冻结了/..,这时候当然要你自己rollback....


黑白灰 2011-11-24
  • 打赏
  • 举报
回复
这个 你去百度下事务的概念就知道什么意思了,度娘有很多这方面的知识。还有 二楼的解释很另类,但是也不错
ci1699 2011-11-24
  • 打赏
  • 举报
回复
各位说的都通俗易懂啊。
yier1013 2011-11-24
  • 打赏
  • 举报
回复
回滚后,以前做的操作都取消,虽然失败了,只要回滚,就恢复到以前的数据。可以保证数据不丢失。
yier1013 2011-11-24
  • 打赏
  • 举报
回复
开始一个事物后(begin stran),执行操作,要么回滚(rollback),要么提交(commit)。
如果你不做回滚或者提交,这时数据库就被锁住了。(因为你再对数据库进行事物的操作)
提交就是确认执行事物中的操作。
回滚就是后悔了不执行操作,当什么事情都没有发生。
gaozhen1990 2011-11-24
  • 打赏
  • 举报
回复
$this->db->trans_rollback();


额, 为什么要加上这一句? mysql不是自动回滚的吗?求解释。
LiveAsaMonster 2011-11-24
  • 打赏
  • 举报
回复
有点意思,但是程序是如何回滚的还是不明白,

$this->db->trans_rollback();

这句是php干的还是mysql干的呢?
heyli 2011-11-24
  • 打赏
  • 举报
回复
要么都成功 要么都失败 数据的一致性等等
比如说 银行的汇钱 你给我汇了一万块 操作是 update table set Money=Money+10000 where name='heyli'
update table set Money=Money-10000 where name='LiveAsaMonster'
那这样就有可能说 只有 update table set Money=Money+10000 where name='heyli' 成功了 但下面的update table set Money=Money-10000 where name='LiveAsaMonster' 失败了
我的钱多而你的钱没少 这样银行肯定是不干的
回滚就变成什么都没操作
大概意思是这样子 不严谨
张小莱 2011-11-24
  • 打赏
  • 举报
回复
用户下订单并且支付了,这个是两张表,用户点击确认支付的时候你得操作这两张表(最起码,可能还有其他的),但是你操作订单表成功了,操作用户账户失败了,那么订单状态是已支付、用户的钱没扣到,你们就亏了。这时候如果采用事务,可以回滚,给用户提示支付失败,数据表没有任何改动。

这是我的对事务的体会。
黄袍披身 2011-11-24
  • 打赏
  • 举报
回复
......
哪个有才的把我发的帖子给编辑了!怪署黍你个坏蛋
[Quote=引用 2 楼 liveasamonster 的回复:]

引用 1 楼 phpnewnew 的回复:
......
好吧请放大联想.你就深刻体会什么是事务了。

神马意思?
[/Quote]
LiveAsaMonster 2011-11-24
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 phpnewnew 的回复:]
......
好吧请放大联想.你就深刻体会什么是事务了。
[/Quote]
神马意思?
黄袍披身 2011-11-24
  • 打赏
  • 举报
回复
......
好吧请放大联想.你就深刻体会什么是事务了。
cergel 2011-11-24
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 hero0524 的回复:]
用户下订单并且支付了,这个是两张表,用户点击确认支付的时候你得操作这两张表(最起码,可能还有其他的),但是你操作订单表成功了,操作用户账户失败了,那么订单状态是已支付、用户的钱没扣到,你们就亏了。这时候如果采用事务,可以回滚,给用户提示支付失败,数据表没有任何改动。

这是我的对事务的体会。
[/Quote] 这个说的不错 我也是这么理解的
兼哲 2011-11-24
  • 打赏
  • 举报
回复
仔细想想你就明白了



打个比方,你去夜店,买了门票就去发现里面是动物园,你出门要退票。


这就叫回滚,如果门卫告诉你,钱已经被他花掉了,这就是没用事务。
啥叫事务,就是你告诉门卫,我给你钱,先进去看看,如果不ok,这钱我还是会要回来的。


你明白?

21,887

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧