12事务

事务是一组sql语句批量执行,要么全部执行成功,要么全部执行失败

START TRANSACTION;#开启事务,关闭mysql自己的自动提交方式,仅限于本窗口

UPDATE account SET money=money-1000 WHERE id=2;
UPDATE account SET money=money+1000 WHERE id=1;

COMMIT;    #提交当前事务
#ROLLBACK 回滚当前事务

原子性:对其数据的修改,要么全都执行,要么全都不执行

一致性:原来怎样,现在还怎样

隔离性:一个事务不能知道另一个事务的执行情况

持久性

只有Innodb数据库引擎的数据库或表才支持事务;

 

 

事务控制语句

BEGIN或START TRANSACTION; 显式地开启一个事务;

SAVEPOINT : 保存点,可以把一个事物分割成几部分.在执行ROLLBACK 时 可以指定在什么位置上进行回滚操作.

SAVEPOINT sa1;
...
ROLLBACK TO sa1;

 

 

当并发事务同时访问一个资源时,有可能导致数据不一致,因此需要一种机制来将数据访问顺序化,以保证数据库数据的一致性。

用法是在事务中的查询语句最后面加上 FOR UPDATE。查询的时候后面的条件,如果表中有主键,那么锁定的是当前行的数据。如果没有主键,那么锁定的是整行表。

START TRANSACTION;

set @m=0;

SELECT money into @m from account where id = 1 FOR UPDATE;

select @m;

-- 看到余额后 充值100 块
update account set money = @m + 100 where id = 1;

SELECT * from account;

COMMIT;

 

next

START TRANSACTION;

set @m=0;

SELECT money into @m from account where id = 1 FOR UPDATE;

select @m;

-- 看到余额后 取款100 块
update account set money = @m - 100 where id = 1;

SELECT * from account;

COMMIT;

 

posted @ 2019-02-07 08:45  余火灬  阅读(167)  评论(0编辑  收藏  举报