本篇文章给大家主要讲的是关于MySQL和复述,事务的区别和用法的内容,感兴趣的话就一起来看看这篇文章吧,相信看完MySQL和复述,事务的区别和用法对大家多少有点参考价值吧又是;,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
复述,
[1]复述,事务可以一次执行多个命令,并且带有以下两个重要的保证:
- <李>批量操作在发送EXEC命令前被放入队列缓存。李> <李>收到EXEC命令后进入事务执行,事务中任意命令执行失败,其余的命令依然被执行。李> <李>在事务执行过程,其他客户端提交的命令请求不会插入到事务执行命令序列中。李>
一个事务从开始到执行会经历以下三个阶段:
- <李>开始事务。李> <>李命令入队。李> <>李执行事务。李>
单个复述,命令的执行是原子性的,但复述,没有在事务上增加任何维持原子性的机制,所以复述,事务的执行并不是原子性的。
事务可以理解为一个打包的批量执行脚本,但批量指令并非原子化的操作,中间某条指令的失败不会导致前面已做指令的回滚,也不会造成后续的指令不做。
操作错误
看着有点儿绕口,那就实际执行一下看一下结果。
127.0.0.1:6379>多 好吧 127.0.0.1:6379>设置tr_1 233 排队 127.0.0.1:6379>lpush tr_1 666 排队 127.0.0.1:6379>设置tr_2 888 排队 127.0.0.1:6379>执行 1)好 2)(错误)WRONGTYPE行动的一个关键错误的值 3)好
在上面的事务中,设置了一个键为tr_1的字符串数据,然后又通过lpush来添加元素,这很明显是错误的操作方式,当我们提交事务候出现了一个操作错误,这时候我们来看看tr_1的值是什么。
127.0.0.1:6379>得到tr_1 “233“
通过得到命令来的tr_1内容还是233,并没有变,那再看一下其他的。
127.0.0.1:6379>键* 1)“tr_2" 2)“tr_1" 127.0.0.1:6379>得到tr_2 “888”; 127.0.0.1:6379>
这里可以看到tr_2存在,并打印了值,这时候我们发现,即使出现了操作错误,但是错误并没有致使执行停止,错误之后的语句也执行了并成功执行,似乎符合上面提到的中间某条指令的失败不会导致前面已做指令的回滚,也不会造成后续的指令不做。
语法错误
没有~,这时候还有另外一种情况语法错误
127.0.0.1:6379>多 好吧 127.0.0.1:6379>设置tr_1 233 排队 127.0.0.1:6379>lpush tr_1 666 排队 127.0.0.1:6379>集 (错误)犯错错号码的理由& # 39;集# 39;命令 127.0.0.1:6379>集233 (错误)犯错错号码的理由& # 39;集# 39;命令 127.0.0.1:6379>设置tr_2 888 排队 127.0.0.1:6379>执行 (错误)EXECABORT事务丢弃,因为之前的错误。 127.0.0.1:6379>键* (空列表或组)
当我们执行到集时没有给任何参数,第二次执行时故意少给了一个参数。可以看到报了语法错误,最后提交事务,也告诉了我们事务因为错误被丢失了,接着用钥匙*检索发现确实如此。
文档释义
这里可以官方文档中提到的
事务内部错误
//在执行过程中可能会遇到两种错误命令错误。
事务处理过程中有可能遇到两种命令错误:
//1。命令无法进入队列,比如:参数数量错误,命令名错误……,或者某些关键错误如内存不足
<李>命令排队可能会失败,所以可能会有一个错误之前执行。例如命令可能语法错误(错误的数量的参数,错误的命令名,…),或者可能会有一些关键的条件像一个内存条件(如果服务器配置为使用maxmemorydirective内存限制)。李>
//2。对键进行错误的操作如上面的对字符串使用lpush
<李>命令执行后可能会失败,例如由于我们执行一个操作对键的值(如调用操作对一个字符串值列表)。李>
//客户端检查键入的命令,大多数时候会在调用执行前发现第一类错误,如果命令执行返回来排队则表示命令正常进入队列,否则错误,大多数情况下客户端会终止放弃这个事务。
客户用来感觉第一种错误,发生在执行调用之前,通过检查排队命令的返回值:如果命令回复与排队排队正确,否则复述,将返回一个错误。如果有一个错误在排队命令,大多数客户将中止事务丢弃它。
引用>关于复述,暂时看到这里接下来看到MySQL MySQL
众所周知,MySQL只有InnoDB引擎支持事务,在启用MySQL事务之前需要先停掉自动提交
测试表结构用户
列类型注释idint(11)自动增量主键IDmoneyint(11)[0]金钱titlevarchar(500)零称呼MySQL和复述,事务的区别和用法