事务简介
案例:创建 账户表(熟悉事务操作)
CREATE TABLE account( id int auto_increment primary key comment "主键ID", name varchar(10) comment "姓名", money int comment "余额" ) comment "账户表"; INSERT INTO account(id, name, money) VALUES (null, "张三", 2000), (null, "李四", 2000);
1)转账操作(张三给李四转账1000)
a. 查询张三账户余额
SELECT money FROM account WHERE name = "张三";
b. 将张三账户余额 -1000
UPDATE account SET money = money - 1000 WHERE name = "张三";
c. 将李四账户余额 +1000
UPDATE account SET money = money + 1000 WHERE name = "李四";
这里需要注意,如果上述三项操作中出现异常的情况,就会导致数据不一致,因此需要将所有操作作为一个整体,一起提交或撤销操作
事务操作
第一种方式,通过关闭事务的自动提交,使用事务的手动提交操作实现(张三给李四转账1000)
-- 查看事务 SELECT @@autocommit; -- 设置 事务为手动提交 SET @@autocommit = 0; -- 1. 查询张三账户余额 SELECT money FROM account WHERE name = "张三"; -- 2. 将张三账户余额 -1000 UPDATE account SET money = money - 1000 WHERE name = "张三"; -- 3. 将李四账户余额 +1000 UPDATE account SET money = money + 1000 WHERE name = "李四"; -- 提交事务 commit; -- 回滚事务 rollback;
第二种方式,不修改事务的提交方式,通过开启事务的操作实现(张三给李四转账1000)
-- 设置 将事务改回自动提交 SET @@autocommit = 1; -- 开启事务 START TRANSACTION; -- 1. 查询张三账户余额 SELECT money FROM account WHERE name = "张三"; -- 2. 将张三账户余额 -1000 UPDATE account SET money = money - 1000 WHERE name = "张三"; -- 3. 将李四账户余额 +1000 UPDATE account SET money = money + 1000 WHERE name = "李四"; -- 提交事务 commit; -- 回滚事务 rollback;
事务的四大特性
事务隔离级别,就是为了解决以上并发事务可能存在的问题