事务
首页->学习资料->微服务治理->sql教程 关键词: 发布时间:2014-12-23 07:51:46 浏览次数:1635

事物(transaction)
注意:事物类似外键约事,只被innodb引擎支持;
一组sql的集合,要么都执行成功,要么都失败,失败时,生成的影响退回到执行sql之前的状态。
往往一个业务逻辑,是由多条语句组合完成的。如银行汇款,a向b汇一千块钱,则a减一千b加一千;必须保证两者都成功执行才生效。

语法:
1开启事务:start transaction可以简写成begin; 一旦开启将会记录之后所执行的所有sql
2提交:commit 如果所有的sql都执行成功,则提交,将sql的执行结果持久化到数据表中;
3回滚rollback 如果存在失败的sql则需要回滚。将sql的执行结果退回到事务开始之前。

无论是回滚还是提交,都会关闭事务。需要再次开启才能使用;
提醒:在没有commit前,在当前命令行窗口查询执行的sql语句看起来是生效的,但是在新命令行客串下看到的是没有生效的。只有当commit成功后,所有命令行窗口中看到的结果才是一样的。


事物的基本原理
commit就会将结果持久化,不提交不会。
如果不开启事务,执行一条sql马上就会持久化数据。
可见,普通的执行就是立即提交。
因为默认的mysql对sql语句的执行是自动提交的。
开启事务其实就是关闭了自动提交的功能。改成了commit执行手动提交。
因此,可以通过对是否自动提交加以设置,可以完成开启事务的目的。
自动提交的特征是保存在服务的一个叫做autocommit的一个变量内的。
可以使用set autocommit=0或1 进行关闭自动提交或者开启自动提交。

事物的特点,ACID
1、原子性 atomicity: 事物是不可分割的;


2、一致性 consistency:保证数据在事务执行周期内是一致的;
通过这样的例子来理解:
假设有三个用户在不同的电脑上同时操作student表中的一条记录,假设这条记录是这样的
id->10 money->9999;
a用户执行如下操作:
start transaction;
update stuedent set money=10000 where id=10;
在敲commit前,b用户执行了这样一条语句:
update student set money=2222 where id=10;(由于a用户开启了transation,此时b用户敲回车时,命令行中显示的不是query ok这样的提示,而是光标闪烁,处于等待状态);
此时a用户再输入commit提交后,b用户的命令行窗口中才会显示出query ok;
最后,当c用户在自己的电脑上敲入select * from student where id=10;会显示10000还是2222呢?
结果是:2222
因为对事物来讲,一旦开启,在没有接收到commit时,数据不会持久化保存,虽然a用户想将money更新为10000但是随后b用户又将money更新为了2222;虽然他们在不同的电脑上,但是服务器最终接收到的是这样的:
a用户:strart transaction;
a用户:update student set money=10000 where id=10;
b用户:update student set money=2222  where id=10;
a用户:commit;
c用户: select * from student where id=10;


3、隔离性 isolation
多个事务之间的干扰关系,体现在隔离级别上;


4、持久性 durability
事务一旦被提交,就不可能再被回滚。

赞:(0)
踩:(0)
相关文章
find_in_set在集合中查找
sql查询自定义排序field函数
sql显示表结构及索引
sql修改表
添加、删除索引
sql分组
sql子查询
sql多表更新
sql建表同时插入数据
sql多表删除
热门文章
win7中将文件拷贝到虚拟机linux下
phpexcel设置行高及列宽,背景颜色,
rabbitmq无法启动
intellij idea不显示git push按钮
php7中使用mongodb的aggregate进行
centos7.4 64位下swoole安装及配置
laravel页面静态化的方法
navicate连接mycat报1184错误
单点登录sso原理及php实现方式及de
devops-jenkins容器为pending状态
好评文章
phpexcel设置行高及列宽,背景颜色,
php7中使用mongodb的aggregate进行
intellij idea打开文件所在文件夹
windows下使用MongoDB Compass Com
win7中将文件拷贝到虚拟机linux下
laravel 中悲观锁 & 乐观锁的使用
单点登录sso原理及php实现方式及de
navicate连接mycat报1184错误
rabbitmq无法启动
laravel整合dingo/api方法步骤:jwt
标签
rabbitmq mysql备份 elasticsearch golang swoole
我的项目
【github】www.github.com/hurong241
【码云】gitee.com/hu_rong/projects
【docker hub】hub.docker.com/repositories/hurong241
【packagist】packagist.org/users/hurong241/packages
站点信息
建站时间:2011年
文章数:607篇
浏览数:946734
粤ICP备18028092号-1  微信:hurong241