事务概念
事务一般包含了一系列的数据库读写操作,简而言之,事务中的一系列操作要成功就是全部操作成功,只要一个操作失败,整个事务操作失败。事务操作包含以下两个目的:
- 为数据库操作提供从失败恢复正常的方法,同时保证在失败情况下依然保持数据一致性
- 当有多个并发程序访问数据库时,可以在应用程序之间提供一个隔离方法,有效防止程序之间彼此的操作
当事务被提交给了数据库管理系统(DBMS),则DBMS需要保证所有操作成功完成并保存到数据库中去,当事务中的某一操作未完成,则事务中的所有操作都需要回滚,回到事务执行前的状态,保证数据一致性;同时改事务的执行对数据库中的其他事物的操作没有影响。 - 例子
某人要在商店使用电子货币购买100元的东西,当中至少包括两个操作:
该人账户减少100元
商店账户增加100元
支持事务的数据库管理系统(transactional DBMS)就是要确保以上两个操作(整个“事务”)都能完成,或一起取消;否则就会出现100元平白消失或出现的情况。
但在现实情况下,失败的风险很高。在一个数据库事务的执行过程中,有可能会遇上事务操作失败、数据库系统/操作系统出错,甚至是存储介质出错等情况。这便需要DBMS对一个执行失败的事务执行恢复操作,将其数据库状态恢复到一致状态(数据的一致性得到保证的状态)。为了实现将数据库状态恢复到一致状态的功能,DBMS通常需要维护事务日志以追踪事务中所有影响数据库数据的操作。
ACID性质
- 原子性(Atomicity):事务作为整体执行,包含在事务中对数据库的操作,要么全部执行,要不都不执行。
- 一致性(Consistency):事务应该保证数据库的状态从一个一致性状态转换到另一个一致性状态。一致性状态指的是数据库中的数据应该满足完整性约束。
- 隔离性(Isolation):多个事务并发操作,一个事务的执行不应当影响其他事务的执行。
- 持久性(Durability):已提交的事务应当永久保存到数据库中。
MySql事务基本语法
-- 使用set语句来改变自动提交模式
set autocommit = 0; /*关闭事务自动提交*/
set autocommit = 1; /*开启事务自动提交*/
-- attention
-- 1.MySQL中默认事务自动提交
-- 2.使用事务操作之前应当先关闭事务自动提交
-- 开始一个事务,标记事务的起始点
start transaction;
-- 调教一个事务给数据库
commit;
-- 将事务回滚,数据回到本次事务的初始状态
rollback;
-- 保存点
savepoint 保存点名称 -- 设置一个事务保存点
rollback to savepoint 保存点名称 -- 回滚到保存点
release savepoint 保存点名称 -- 删除保存点
实例测试
问题:
A在线买一款价格为500元商品,网上银行转账.
A的银行卡余额为2000,然后给商家B支付500.
商家B一开始的银行卡余额为10000
- 创建表account并插入2条数据
create table `account`(
`id` int(8) not null auto_increment,
`name` varchar(32) not null,
`cash` decimal(9,2) not null,
primary key (`id`)
)engine=Innodb default charset=utf8
insert into `account`(`name`,`cash`) values ('A',2000.00),('B',1000.00)

- 转账实现
set autocommit = 0; -- 关闭自动提交
start transaction; -- 开始一个事务,标记事务的起始点
update account set cash = cash - 500 where name = 'A';
update account set cash = cash + 500 where name = 'B';
commit; -- 提交事务
# rollback
set autocommit = 1; -- 恢复自动提交


85万+

被折叠的 条评论
为什么被折叠?



