理解事务
一、事务的概念
通俗版理解:
1.不止一个执行步骤
2.如果错了一个步骤,整个过程都不算数,也就是说要么执行,要么都不执行
3.在做事务的过程中,任何人都不能影响我
东北小品版理解:
执行事务就像把大象放冰箱,总共分三步,把冰箱门打开-》把大象放进冰箱-》帮冰箱门关上,如果这三步有一步没有成功,那大象和冰箱都要回到最初状态,而在放大象的过程中,本山大叔和丹丹姐都不能动大象和冰箱。
二、事务的格式
存储引擎为InnoDB时支持事务,实际上会自动提交commit,一般情况下当需要手动提交时,采用如下格式
start TRANSACTION;
......
COMMIT;/ROLLBACK;
自定义异常处理
在存储过程中发生异常时,要用自定义异常处理
格式:
DECLARE xxx1 HANDLER FOR xxx2 执行sql;
xxx1:CONTINUE|EXIT|UNDO
xxx2:SQLSTATE|SQLWARNING|NOT FOUND|SQLEXCEPTION
创建用户余额表
创建用户余额表,名为user_balance,存储引擎为InnoDB,表结构如下图
用户余额表中包括:id,用户id,用户余额
创建用户金额日志表
创建用户金额日志表,名为user_balance_log,存储引擎为InnoDB,表结构如下图
用户金额日志表包括:id,用户id,日志类型(1代表充值2代表消费3代表转账),日志备注,发生金额(可以为负值),发生时间(默认为CURRENT_TIMESTAMP)
并发控制
当多个线程对同一个对象进行操作的时候,如果不加控制往往会发生数据错误。而并发控制是确保及时纠正由并发操作导致的错误的一种机制,锁是一种常见的并发控制技术。
一、表级锁:将整个表都锁住,InnoDB和MyISAM都支持表级锁,随着并发的增多,执行的速度也会越来越慢
1.读锁:如果一张表是被读锁给锁住了,无论是本地会话还是外部会话(本地会话和外部会话来模拟类似php这样的多线程程序)都只能执行select操作而不能执行update操作(update insert delete),格式为
LOCK TABLE 表名 READ;