学斋随笔,初九潜龙勿用,-29

    关于事务,我们需要有一个概念,那银行交易比喻很合适,一次性的执行完成,这叫事务,要么多条语句一次性执行完成,要么就一条也不执行。

    在数据库中可以将“多条语句”的执行,当作“一条语句”来看到的一种内部机制,这叫事务。

    事务具有四大特点,如下:    

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

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

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

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

     运用事务,这可以避免一些惨案的发生,比如你转了一笔钱,当到中途时突然断电,如果有事务,那么恭喜,避免了一场惨剧的发生。

    

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

     事务的基本实现流程:

        

1,声明事务开始:start transaction;

 

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

 

3,判断是否需要执行该些语句:

 

if( 判断是否有错误){

 

//执行——才针对执行了物理性改变——即生效。

 

commit;

 

}

 

eslse{

 

//回滚——不执行任何语句。

 

rollback;

 

}

 

判断是否有错误通常分这两种环境:

 

1,如果是cmd中,直接观察是否出错。

 

2,如果是php程序中,那就需要使用 mysql_error()函数来判断是否有错。

 

 

 

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

 

start  transaction;

 

#第一步:

 

update  cunkuan  set 存款=存款-4000  where id=2;

 

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

 

#第二步:

 

update  cunkuan  set 存款=存款+4000  where id=1;

 

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

 

commit;

 

但,如果其中发生了错误,则可以:

 

rollback;

 

 

猜你喜欢

转载自www.cnblogs.com/biruofeng/p/10225070.html