事务
Posted saxon宋
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了事务相关的知识,希望对你有一定的参考价值。
事务
-
什么是事务?
要么都成功,要么都失败
-
事务原则: ACID原则性 一致性,隔离性,持久性 (脏读,幻读)
原子性(Atomicity)
要么都成功,要么都失败
一致性(Consistency)
事务前后数据的完整性必须保持一致。持久性(Durability) —- 事务提交
事务一旦提交则不可逆,被持久化到数据库中!
隔离性(Isolation)
事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离
-
隔离所导致的一些问题
脏读:
指一个事务读取了另外一个事务未提交的数据。
不可重复读:
在一个事务内读取表中的某一行数据,多次读取结果不同。(这个不一定是错误,只是某些场合不对)
虚读(幻读)
是指在一个事务内读取到了别的事务插入的数据,导致前后读取不一致。(一般是行影响,多了一行)
-
执行事务
-- ========== 事务 ========== -- mysql 是默认开启事务自动提交的 SET autocommit = 0 /*关闭*/ SET autocommit = 1 /*开启(默认的)*/ -- 手动处理事务 SET autocommit = 0 -- 关闭自动提交 -- 事务开启 START TRANSACTION -- 标记一个事务的开始,从这个之后的sql都在同一个事务内 INSERT xx INSERT xx -- 提交: 持久化 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`) VALUE (\'A\',2000.00),(\'B\',10000.00); -- 模拟转账: 事务 SET autocommit = 0; -- 关闭自动提交 START TRANSACTION -- 开启一个事务 UPDATE account SET money=money-500 WHERE `name` = \'A\' -- A减500 UPDATE account SET money=money+500 WHERE `name` = \'B\' -- B加500 COMMIT; -- 提交事务,就被持久化了! ROLLBACK; -- 回滚 SET autocommit = 1; -- 恢复默认值
以上是关于事务的主要内容,如果未能解决你的问题,请参考以下文章