1 什么是事务?
要么都成功,要么都失败
1.1 事务原则:acid-----原子性、一致性、隔离性、持久性
原子性:事务有不可分割性,要么都成功,要么都失败,不会只发生一个动作。
一致性:事务操作前后的状态一致。
隔离性:多个用户同时操作,事务之间具有隔离性,不会影响本次事务操作。
持久性:事务结束后的数据不会因外界的原因导致数据丢失,一旦提交不可逆,持久化保存到数据库。
1.2 事务的隔离导致的问题:脏读、不可重复读、幻读
脏读:事务读取到其他事务未提交的数据
不可重复读:一个事务内读取多次读取同一数据,结果不一样。
幻读:一个事务内读取到别的事务插入的数据,导致前后读取不一致。
## mysql是默认开启事务自动提交的,关闭自动事务提交:set autocommit=0 // 开启自动事务提交:set autocommit=1
事务的执行流程:
//1、--关闭事务自动提交
set autocommit=0 --关闭事务自动提交
//2、事务开启:
start transaction -----标记一个事务的开始,之后的sql都在同一个事务内。
//3-1、事务执行成功,提交:持久化
commit
//3-2、事务执行失败,回滚 :回滚到原来的样子
rollback
//4、事务结束,开启事务自动提交
set autocommit=1 ---开启事务自动提交
savepoint 保存点 ------设置事务的保存点
rollback to savepoint ======回滚到保存点
release savepoint -----移除保存点
模拟转账场景测试
-- 创建数据库
CREATE DATABASE bank CHARACTER SET utf8 COLLATE utf8_general_ci ;
-- 切换数据库
USE bank;
-- 创建表格
CREATE TABLE IF NOT EXISTS `account` (
`id` INT(4) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(16) NOT NULL,
`money` DECIMAL(9,2) NOT NULL,
PRIMARY KEY (`id`)
)ENGINE=INNODB DEFAULT CHARSET =utf8
-- 插入数据
INSERT INTO `account`(`name`,`money`) VALUES('张三',5000.00),('李四',10000.00)
-- 查询数据
SELECT * FROM account
-- 关闭自动事务提交
SET autocommit=0
-- 更新数据
UPDATE `account` SET `money`=`money`-500 WHERE `name`='张三';
UPDATE `account` SET `money`=`money`+500 WHERE `name`='李四'
-- 事务提交,持久化
COMMIT
-- 事务回滚,回到原来的状态
ROLLBACK