数据库事务

it2024-11-11  5

六、事务

什么是事务 要么都成功,要么都失败将一组sql放在一个批次中去执行 事务原则:ACID原则 原子性:要么都成功,要么都失败一致性:事务前后的数据完整性要保证一致隔离性:事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,事务之间要相互隔离持久性:事务一旦提交就不可逆转,被持久化到数据库中 隔离所导致的一些问题 脏读:一个事务读取了另外一个事务未提交的数据不可重复读:在一个事务内读取表中的某一行数据,多次读取结果不同虚读(幻读):指在一个事务内读取到了别的事务插入的数据,导致前后读取不一致

执行事务

mysql是默认开启事务自动提交的

SET autocommit=0 -- 关闭自动事务 SET autocommit=1 -- 开启自动事务 -- 手动处理事务 SET autocommit=0 -- 关闭自动事务 -- 开启事务 START TRANSACTION -- 标记一个事务的开始,从这个之后的sql,都在同一个事务内 -- 提交(成功) COMMIT; -- 回滚(失败) ROLLBACK; -- 事务结束 SET autocommit=1 -- 开启自动事务 -- 下面的了解即可 SAVEPOINT -- 设置一个事务的保存点 ROLLBACK TO SAVEPOINT -- 回滚到保存点 RELEASE SAVEPOINT -- 删除保存点 模拟场景 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),('B',10000) -- 模拟转账:事务 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;
最新回复(0)