1、数据库事务特性
什么是事物?要么都成功,要么都失败
比如 A卡里有 1000 块,B 卡有500 块
A 转账 100 到 B 卡
如果在转账的时候,只执行到一半,A 转账了,B 没收到,这样肯定是不行的
所以需要事务来保证安全性
事务原则:ACID 原则
- 原子性
- 一致性
- 隔离性
- 持久性
隔离级别
- 读取未提交 : 有脏读的问题
- 读取已提交:有不可重复读的问题
- 可重复读:有幻读的问题
- 可串行化:解决以上所有问题
2、事务转账的实例
执行事务
事务处理过程
- 关闭自动提交
- 开启一个事物
- 如果成功则提交
- 如果失败则回滚
事务结束后,开启自动提交
-- ========事务========
-- mysql 是默认开启事务自动提交的
SET autocommit = 0 /*关闭*/
SET autocommit = 1 /*开启*/
-- 手动去处理事务
-- 事务开启
START TRANSACTION -- 标记一个事物,从这个之后的 SQL 都在同一个事务内
-- insert xx
-- 提交:持久化(成功!)
COMMIT
-- 回滚: 回到原来的样子 (失败!)
ROLLBACK
-- 事务结束
SET autocommit = 1 /*开启自动提交*/
模拟场景:银行转账
-- ======== 模拟银行转账案例===========
CREATE DATABASE shop CHARACTER SET utf8 COLLATE utf8_general_ci
USE shop
CREATE TABLE `account`(
`id` INT(3) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(30) NOT NULL,
`money` DECIMAL(9,2) NOT NULL,
PRIMARY KEY (`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8
INSERT INTO `account`(`name`,`money`)
VALUES ('A',2000.00),('B',10000.00)
SET autocommit =0 -- 关闭自动提交
START TRANSACTION -- 开启一个事物
UPDATE `account` SET money = money-500 WHERE `name`='A'
UPDATE `ACCOUNT` SET money = money+500 WHERE `name`='B'
COMMIT; -- 提交事物
ROLLBACK; -- 回滚
SET autocommit = 1;
3、事务使用场景
在实际的开发过程中,一个业务操作如:转账,往往是要多次访问数据库才能完成的。转账是一个用户扣钱,另一个用户加钱。如果其中有一条 SQL 语句出现异常,这条 SQL 就可能执行失败。事务执行是一个整体,所有的 SQL 语句都必须执行成功。如果其中有 1 条 SQL 语句出现异常,则所有的 SQL 语句都要回滚,整个业务执行失败