赞
踩
原子性:针对一个事务的两个步骤一起成功或一起失败,不能只发生其中一个动作,不允许分割
一致性:针对一个事务操作前和操作后的状态一致,数据库从一个正确的状态变化到另一个正确的状态。结果最终一致性
持久性:事务还没有提交,恢复到原状、已经提交了,持久化到数据库,一旦提交不可逆。
隔离性:针对多个用户同时并发操作,排除其他事务对本次事务的影响,互不干扰;数据库为每个用户开启事务,不能被其他事务的操作数据干扰。
SET [GLOBAL | SESSION] TRANSACTION ISOLATION LEVEL <isolation-level>
GLOBAL:代表设置全局事务级别
SESSION:代表设置会话事务级别
设置会话隔离级别为READ COMMITTED↓
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
或
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
设置全局隔离级别为READ COMMITTED↓
SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED;
查看会话隔离级别
select @@tx_isolation;
show variables like '%isolation%';
查看全局隔离级别
select @@global.tx_isolation;
Mysql默认开启
无论是否开启事务,都会马上执行命令,只是开启事务后将状态存入redo日志,commit后才写入磁盘
BEGIN; COMMIT; ROLLBACK;
-- 事务开启
BEGIN;
INSERT INTO testmd5(`name`,`pwd`) VALUES('李云',MD5('123456'));
COMMIT; -- 提交
BEGIN;
INSERT INTO testmd5(`name`,`pwd`) VALUES('王华',MD5('123456'));
ROLLBACK; -- 回滚
-- 事务开启
BEGIN;
INSERT INTO testmd5(`name`,`pwd`) VALUES('李云',MD5('123456'));
COMMIT; -- 提交
BEGIN;
INSERT INTO testmd5(`name`,`pwd`) VALUES('王华',MD5('123456'));
ROLLBACK; -- 回滚
Redis:multi(标记事务开始)、exec(执行commands队列)、discard(结束事务,并消除commands队列)
Redis默认关闭
没开启事务:立即执行并返回结果,直接写入内存
开启事务:不会立刻执行,排入队列,并返回队列状态,调用exec才会执行commands中的命令
6.5.5.事务是否原子性
-- 事务开启 BEGIN; INSERT INTO testmd5(`id`,`name`,`pwd`) VALUES(8,'王m',MD5('123456')); INSERT INTO testmd5(`id`,`name`,`pwd`) VALUES(8,'王m',MD5('789456')); COMMIT; -- 提交 [SQL]BEGIN; 受影响的行: 0 时间: 0.001s [SQL] INSERT INTO testmd5(`id`,`name`,`pwd`) VALUES(8,'王m',MD5('123456')); 受影响的行: 1 时间: 0.000s [SQL] INSERT INTO testmd5(`id`,`name`,`pwd`) VALUES(8,'王m',MD5('789456')); [Err] 1062 - Duplicate entry '8' for key 'PRIMARY'
exec
,所有命令都不会执行exec
,正确命令会被执行,错误命令抛出异常SET autocommit = 0 -- 关闭 SET autocommit = 1 -- 开启默认 -- 手动处理事务先关闭 SET autocommit = 0; -- 关闭自动提交 -- 事务开启 START TRANSACTION -- 标记一个事务的开始,从这个命令之后的sql都在一个事务中 DML -- 事务结束 -- 提交:持久化(成功) COMMIT -- 回滚:回到原来的样子(失败) ROLLBACK; SET autocommit = 1 -- 开启自动提交 -- 其他 SAVEPOINT 保存点名; -- 设置一个事务的保存点 ROLLBACK to SAVEPOINT 保存点名; -- 回滚到保存点 RELEASE SAVEPOINT 保存点名; -- 释放保存点
set autocommit = 0;
START TRANSACTION;
UPDATE `account` set `money` = `money`-200 WHERE name = '张三';
UPDATE `account` set `money` = `money`+200 WHERE name = '李四';
COMMIT;
ROLLBACK;
set autocommit = 1;
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。