事务原则: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; -- 恢复默认值
本文来自博客园,作者:阿霖找BUG,转载请注明原文链接:https://www.cnblogs.com/lin-07/articles/16241606.html