事务是一组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;