- 概念:如果一个包含多个步骤的业务操作,被事务管理,那么这些操作要么同时成功,要么同时失败。
例如1:
张三有1000元,李四有一千元
CREATE TABLE account(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARBINARY(10),
balance DOUBLE
);
INSERT INTO account (NAME,balance) VALUES ('zhangsan',1000),("lisi",1000);
SELECT*FROM account;
张三给李四转500,中间出现了错误语句,则会出现500元凭空消失的错误
UPDATE account SET balance = balance - 500 WHERE NAME="zhangsan";
出错了。。。
UPDATE account SET balance = balance + 500 WHERE NAME="lisi";
因此需要“事务”来处理
- 操作:
- 开启业务:
start transaction;
- 回滚:
rollback;
- 提交:
commit;
例如2: 使用“事务”来处理
张三给李四转500之前开启事物,再转钱
TART TRANSACTION;//开启事物
UPDATE account SET balance = balance - 500 WHERE NAME="zhangsan";
出错了。。。
UPDATE account SET balance = balance + 500 WHERE NAME="lisi";
此时还会出现500丢失的结果,但是是临时的
发现出现问题了,使用rollback
回滚事物
START TRANSACTION;
UPDATE account SET balance = balance - 500 WHERE NAME="zhangsan";
出错了。。。
UPDATE account SET balance = balance + 500 WHERE NAME="lisi";
//发现出现问题了,回滚事物
ROLLBACK;
数据还会恢复到初始的状态
问题处理以后,使用commit
提交事物
START TRANSACTION;
UPDATE account SET balance = balance - 500 WHERE NAME="zhangsan";
UPDATE account SET balance = balance + 500 WHERE NAME="lisi";
COMMIT;
- 自动提交与手动提交
- MySQY数据库是默认自动提交事务的(一条DML(增删改)语句之后,不用加
commit
,数据也会变化) - Oracle数据库默认是手动提交事务的
- MySQY数据库修改默认提交方法
- 查看默认提交方式:
select @@autocommit;
(1-自动,0-手动) - 修改为手动提交:
set @@autocommit = 0;