mysql事物

来源:互联网 发布:q动态头像软件 编辑:程序博客网 时间:2024/05/16 08:52

home 老师开课了 :

事物demo 在下面   讲解一下哈:

事物我的理解就是同生共死的关系,要么一起生,要么一起......  发挥想象自己想吧

经典案例: 银行转账案例   

转账需要两步 :

1. 转账的用户的钱减少  

        2.接到转账的人的账户失败

那么假如A用户余额不足,那么B用户能接收到转账资金吗? 答案是不能的 

所以说1,2操作要么一起成功要么一起失败 , 如果单独执行的话,1没成功,2成功了,银行亏了

事物开启的时候,别的用户是不能进行操作这个数据库的,直到数据库提交或者回滚

事物操作的时候   其实是数据库的数据的拷贝,如果commit了 , 那么数据库的数据就真的改变了,否则数据库的数据是不会发生改变的

(数据真的改变了,最后回滚回来了)

•使用下列语句来管理事务:
–开始事务:STARTTRANSACTION
–提交事务:COMMIT
–回滚(撤销)事务:ROLLBACK

一旦事务提交或回滚,则事务结束。


事务必须具备以下四个属性,简称ACID 属性:

–原子性(Atomicity):事务是一个完整的操作。事务的各步操作是不可分的(原子的);要么都执行,要么都不执行
–一致性(Consistency):当事务完成时,数据必须处于一致状态
–隔离性(Isolation):对数据进行修改的所有并发事务是彼此隔离的,这表明事务必须是独立的,它不应以任何方式依赖于或影响其他事务
–永久性(Durability):事务完成后,它对数据库的修改被永久保持,事务日志能够保持事务的永久性


CREATE TABLE bank
(
    customerName CHAR(10),  
    currentMoney float     
)
INSERT INTO bank(customerName,currentMoney)
        VALUES('张三',1000)
INSERT INTO bank(customerName,currentMoney)
        VALUES('李四',1)


UPDATE bank SET currentMoney=currentMoney-2000 
     WHERE customerName='张三'
UPDATE bank SET currentMoney=currentMoney+2000 
     WHERE customerName='李四'     


select * from bank ;


UPDATE bank SET currentMoney=1000 
     WHERE customerName='张三'  ;   
UPDATE bank SET currentMoney=1
     WHERE customerName='李四';     


create procedure proc_transferMany
(
    in fromname varchar(20),    
    in toname varchar(20),    
    in cash decimal(9,2)
)
begin
  declare err int default 0;    
  declare continue handler for sqlexception set err=1;  
  start transaction;
  UPDATE bank SET currentmoney=currentmoney-cash WHERE customername=fromname;      
  if(select currentmoney from bank where customername=fromname)<0 then  
     set err=1;
  end if;
  UPDATE bank SET currentmoney=currentmoney+cash WHERE customername=toname;
  if err=1 then
     rollback;  
  else
     commit;  
  end if;  
End;
select * from bank ;