1.什么是事务
事务:事务(TRANSACTION)是一种机制、一个操作序列,包含了一组数据库操作命令,并且把所有的命令作为一个整体一起向系统提交或撤销操作请求,即这一组数据库操作命令要么都执行,要么都不执行。
事务是一个不可分割的工作逻辑单元 。
转账过程就是一个整体 它需要两条UPDATE语句来完成,这两条语句是一个整体 如果其中任一条出现错误,则整个转账业务也应取消,两个账户中的余额应恢复到原来的数据,从而确保转账前和转账后的余额不变,即都是1001元
2.事务的特性
事务必须具备以下四个属性,简称ACID 属性
(1)原子性(Atomicity)
事务的各步操作是不可分的(原子的),要么都执行,要么都不执行
(2)一致性(Consistency)
当事务完成时,数据必须处于一致状态
(3)隔离性(Isolation)
并发事务之间彼此隔离、独立,它不应以任何方式依赖于或影响其他事务
(4)持久性(Durability)
事务完成后,它对数据库的修改被永久保持
3.MySQL事务处理
MySQL中支持事务的存储引擎有InnoDB和BDB。
方法1:用 BEGIN, COMMIT,ROLLBACK来实现。
BEGIN ; #开始事务,显式地标记一个事务的起始点
COMMIT ; #提交事务,标志一个事务成功提交。
ROLLBACK; #回滚事务,清除自事务起始点至该语句所做的所有数据更新,将数据状态回滚到事务开始前,并释放由事务控制的资源。
方法2:直接用 SET 来改变 MySQL 的自动提交模式。
默认情况下,每条单独的SQL语句视为一个事务
关闭默认提交状态后,可手动开启、关闭事务
SET autocommit = 0|1;
值为0:关闭自动提交
值为1:开启自动提交
实例代码展示
程序场景
银行转账问题 假定资金从账户A转到账户B,至少需要两步 账户A的资金减少 然后账户B的资金相应增加
-- 正常情况
-- 张三-500
UPDATE BANK SET MONEY = MONEY-500 WHERE ID = 1
-- 李四+500
UPDATE BANK SET MONEY = MONEY+500 WHERE ID = 2
-- 提交
COMMIT;
-- MYSQL默认事务自动提交
-- 1.设置不自动提交 直接用SE来改变Mysql的自动提交模式
-- 关闭默认提交状态后,可手动开启,关闭事务
-- SET AUTCOMMIT = 0|1
-- 值为0:关闭自动提交
-- 值为1:开启自动提交
SET AUTOCOMMIT = 0
-- 非正常的情况
-- 张三-500
UPDATE BANK SET MONEY = MONEY-500 WHERE ID = 1
#异常
-- 2.出现异常时设置事务回滚
-- 李四+500
UPDATE BANK SET MONEY = MONEY+500 WHERE ID = 2
#异常
-- 回滚
ROLLBACK