事务
事务是一个最小执行单元,有多个sql语句组成,
一个事务中,所有的sql语句执行完成功后,整个事务成功;有一个sql语句失败,整个事务执行失败。
事务的边界
开始:
- 连接到sql,执行一条dml语句
- 上一个事务结束,又输入一条DML语句
结束:
- 提交 a.显示提交:commit b.隐式提交:一条创建、删除语句,正常退出
- 回滚 a.显示回滚:rollback b.隐式回滚:非正常退出(断电、宕机)
回滚段
数据库为每一个客户端都维护一个空间独立的缓存区,叫做回滚段,
所有增删改语句的执行结果都缓存在其中,只有事务中所有sql语句都正常结束commit,
才将回滚段中缓存的数据同步到数据库,否则,整个事务回滚rollback。
事物的特性
1.Atomicity: 原子性,最小不可拆分
2.Consistency:一致性,从一个一致状态到另一个一致状态,一个失败都返回原状态
3.Isolation:隔离性,多个事物之间互相隔离互不影响。事务执行前后结果可见,中间不可见
4.Durability:持久性,对系统影响是永久性的
事务的使用
CREATE TABLE testtable(
id INT PRIMARY KEY AUTO_INCREMENT,
`name` VARCHAR(20) NOT NULL,
age INT DEFAULT 20,
money INT DEFAULT 0
)CHARSET=utf8;
INSERT INTO testtable(`name`,money) VALUE ('张三',2000);
INSERT INTO testtable(`name`,money) VALUE ('李四',3000);
DELIMITER // #创建存储过程
BEGIN #整个存储过程设置为一个事务
#定义一个int类型变量t_error初值为0
DECLARE t_error INTEGER DEFAULT 0;
#声明mysql遇到异常时继续(CONTINUE)执行 并将t_error设为1
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET t_error=1;
START TRANSACTION;
UPDATE testtable SET money=money-1000 WHERE NAME='张三';
UPDATE testtable SET money=moneys+1000 WHERE NAME='李四';#这一句出错
#判断出错回滚,不出错提交
IF t_error = 1 THEN
ROLLBACK;
ELSE
COMMIT;
END IF;
END
//
DROP TABLE testtable;