MySQL数据库-----事务(ACID)

事务(ACID)

  • 要么都成功,要么都失败

  • 事务原则:ACID,即原子性一致性,隔离性,持久性

    • 原子性(Atomicity):指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生
    • 一致性(Consistency):事务前后的数据完整性的需要保持一致
    • 隔离性(Isolation):事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离
    • 持久性(Durability):一个事务一旦被提交,数据就永久性的保存在数据库中
  • 隔离性所导致的一些问题

    • 脏读:指一个事务读取了另外一个事务未提交的数据
    • 不可重复读:在一个事务内读取表中的某一行数据,多次读取结果不同。(这个不一定是错误,只是某些场合不对)
    • 虚读(幻读):是指在一个事务内读取到了别的事务插入的数据,导致前后读取不一致。(一般是行影响,多了一行)
--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 保存点名 --撤销保存点
--事务案例-->银行转账
--1.创建表
CREATE TABLE `account`(
`id`int(11) not null auto_increment COMMENT'唯一的标识',
`name`VARCHAR(11) not NULL COMMENT'账户名',
`money`DECIMAL(9,2) not null COMMENT'账户余额',
PRIMARY KEY(`id`)
)ENGINE=InnoDB DEFAULT CHARSET=utf8
--2.插入数据
INSERT into `account`(`name`,`money`)VALUES('A',1000),('B',200)
--3.模拟转账:事务
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 --开启自动提交,恢复默认值

猜你喜欢

转载自blog.csdn.net/insist_to_learn/article/details/112033607
今日推荐