事务原则:ACID原则   原子性,一致性,隔离性,持久性     (脏读,幻读)

原子性(Atomicity)

要么都成功,要么都失败

eg:银行转账(A转给B)两个用户要么都成功,要么都失败,不存在A在转钱的时候死机,A扣了,B没收到的情况

一致性(Consistency)

事务前后的数据完整性要一致。

eg:银行转账(A转给B)两个用户总共1000块,转后也是1000块

持久性(Durability) -- 事务提交

事务一旦提交则不可逆,被持久化到数据库中!

eg:转账不成功则保持原状,但一旦成功了就不可逆了,持久化到数据库里了。

隔离性(Isolation)

事务的隔离性是多个用户并发访问数据库是,数据库为每一个用户开始的事务隔离,不能被其他事务干扰。

eg:A->B,C->D,C是不会读取到B的账户的。但不绝对可能存在脏读

脏读:

指的是一个事务读取了另一个事务未提交的数据

不可重复读

在一个事务中读取某一行数据,多次读取结果不一致(不一定是错误,只是某些场合不对)

eg:第一次事务完成后,A->B,C->B,第二次读取的时候,B和第一次不一样了

虚读(幻读)

是指一个事务读取到别的事务插入的数据,导致前后不一样

eg:表格里只有A,B,C现在插入一个D,第二次读取的结果就不一样了

 

 

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

手动处理事务:

set autocommit=0;-- 第一步先关闭自动提交

START TRANSACTION -- 开启一个事务(一组事务)

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) 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','500.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; -- 恢复默认值

 

posted on 2022-05-07 11:02  阿霖找BUG  阅读(35)  评论(0)    收藏  举报