数据库之事务
为什么要有事务
事务广泛的运用于订单系统、银行系统等多种场景
例如:A用户和B用户是银行的储户,现在A要给B转账500元,那么需要做以下几件事:
检查A的账户余额>500元;
A 账户中扣除500元;
B 账户中增加500元;
正常的流程走下来,A账户扣了500,B账户加了500,皆大欢喜。那如果A账户扣了钱之后,系统出故障了呢?A白白损失了500,而B也没有收到本该属于他的500。以上的案例中,隐藏着一个前提条件:A扣钱和B加钱,要么同时成功,要么同时失败。事务的需求就在于此
所谓事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。
例如,银行转帐工作:从一个帐号扣款并使另一个帐号增款,这两个操作要么都执行,要么都不执行。所以,应该把他们看成一个事务。事务是数据库维护数据一致性的单位,在每个事务结束时,都能保持数据一致性
事务命令
要求:表的引擎类型必须是innodb类型才可以使用事务,这是mysql表的默认引擎
查看表的创建语句,可以看到engine=innodb
show create table students;
修改数据的命令会触发事务,包括insert、update、delete
开启事务,命令如下:
开启事务后执行修改命令,变更会维护到本地缓存中,而不维护到物理表中
begin;
提交事务,命令如下
将缓存中的数据变更维护到物理表中
commit;
回滚事务,命令如下:
放弃缓存中变更的数据
rollback;
提交
为了演示效果,需要打开两个命令行窗口,使用同一个数据库,操作同一张表
step1:连接
命令行1:查询学生信息
select * from students;
step2:增加数据
命令行2:开启事务,插入数据
begin;
insert into students(studentNo,name) values ('013','我是新来的');
命令行2:查询数据,此时有新增的数据
select * from students;
step3:查询
命令行1:查询数据,发现并没有新增的数据
select * from students;
step4:提交
命令行2:完成提交
commit;
step5:查询
命令行1:查询,发现有新增的数据
select * from students;
加入出现中文乱码,解决方法如下:
set names 'gbk';
set names 'gbk';
set names 'gbk';
回滚
为了演示效果,需要打开两个命令行窗口,使用同一个数据库,操作同一张表
step1:连接
命令行1
select * from students;
step2:增加数据
命令行2:开启事务,插入数据
begin;
insert into students(studentNo,name) values ('014','又来一个');
命令行2:查询数据,此时有新增的数据
select * from students;
step3:查询
命令行1:查询数据,发现并没有新增的数据
select * from students;
step4:回滚
命令行2:完成回滚
rollback;
step5:查询
命令行1:查询数据,发现没有新增的数据
select * from students;
相关文章
- Mysql加锁过程详解(6)-数据库隔离级别(2)-通过例子理解事务的4种隔离级别
- mysql向数据库插入小数,变成了整数,解决方案
- Spring数据库事务典型错误用法剖析
- 在 Ubuntu 上安装世界上最先进的开源数据库 PostgreSQL 9.4 和 phpPgAdmin
- 第77节:Java中的事务和数据库连接池和DBUtiles
- django之创建第8个项目-数据库配置及同步研究
- Pivotal开源基于PostgreSQL的数据库Greenplum
- HikariPool-1 - Connection is not available, request timed out after 30000ms——数据库事务与数据库连接
- 《SQL入门经典(第5版)》一一6.3 事务控制与数据库性能
- acid (数据库事务正确执行的四个基本要素的缩写)
- jbpm3.2创建数据库
- 数据库小技巧:使用distinct去除重复行
- 数据库中的事务、存储过程和触发器的简单使用
- 为什么数据库事务会出现未知状态,如何处理
- Redis在数据库事务中的增改操作
- Spring对事务的支持及数据库事务
- 【数据库】数据库索引、数据库事务的隔离级别
- 数据库事务的悲观锁和乐观锁
- 一个可以兼容各种数据库事务的使用范例
- 首次全备及事务备份对数据库的影响,2014 SpexSql log评估版探索
- 狂神说笔记——SpringBoot操作数据库22-4
- sqlserver使用clr调用ajax,在数据库内请求外部链接
- 数据库 'MessageManage' 的事务日志已满。若要查明无法重用日志中的空间的原因,请参阅 sys.databases 中的 log_reuse_wait_desc 列。
- SQL server低版本通过还原至高版本数据库“DBNAME”时失败