事物(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
事务一旦被提交,就不可能再被回滚。
- 相关文章
- find_in_set在集合中查找
- sql查询自定义排序field函数
- sql显示表结构及索引
- sql修改表
- 添加、删除索引
- sql分组
- sql子查询
- sql多表更新
- sql建表同时插入数据
- sql多表删除
- 热门文章
- win7中将文件拷贝到虚拟机linux下
- phpexcel设置行高及列宽,背景颜色,
- rabbitmq无法启动
- intellij idea不显示git push按钮
- php7中使用mongodb的aggregate进行
- laravel页面静态化的方法
- centos7.4 64位下swoole安装及配置
- navicate连接mycat报1184错误
- curl设置超时不起作用(CURLOPT_TIM
- 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
- 我的项目
- 【github】www.github.com/hurong241
- 【码云】gitee.com/hu_rong/projects
- 【docker hub】hub.docker.com/repositories/hurong241
- 【packagist】packagist.org/users/hurong241/packages
- 站点信息
- 建站时间:2011年
- 文章数:623篇
- 浏览数:1303109