mysql 事务
mysql 事务
在有些情况下,我们的sql语句是单一执行的,就是每条sql 语句的成功失败相互没有关联,但是有些sql 语句的执行是相关的,不如一个商城站,用户够买一个商品,那么购物车就应该添加一个条记录,而商品库存就要减少,这两条sql 语句必须同时成功才行,如果购物车有新的记录,而商品库存减少的sql 语句出错了,那么数据库的数据就出现问题的,那么可以把 这两个语句看成功一个事务,两条语句同时成功,则执行,如果有一条语句不成功则不执行。
事务的原理:
在运行一组 sql 语句之前设计一个记号备份点。
如果sql 语句组执行成功则提交操作。
如果执行失败则返回备份点。
利用 innodb 存储引擎的事务日子功能!
Innodb 在运行sql 语句是 首先是运行事务日志 如果sql 语句没有问题则自动提交给数据库。 我们要将自动提交功能关闭,如果sql语句组都没有问题则一起提交。
如果成功提交到数据库内,一旦提交数据库就表示更改了数据库!
Sql 语句执行分成两个阶段
1. 执行阶段(事务日志中)
2. 将执行的结果,提交到数据库的阶段!
我们的事务日志 就是保存执行阶段的结果!
如果用于选择提交,则才将执行结果提交到数据库!
默认的执行方式 为 自动提交方式,执行完毕后自动提交。
因此需要关闭自动提交功能!
修改自动提交
存在一个系统的变量,
autocommit 可以对自动提交进行配置
Set autocommit=1; 表示开启自动提交
Set autocommit=0; 表示关闭自动提交
关闭自动提交后,再次执行sql 语句后 ,发现在其他的连接中没有发生变化,因为结果没有被提交!
在这个基础上执行所有的sql语句。
判断是否都成功(出现的错误 包括 语法错误,和逻辑错误 服务器错误)。
成功:将结果提交 利用 commit
失败:回到 开始的位置 利用 rollback
常用的事务指令:
Start transaction; 开启事务
也可以使用 start begin;
特点是事务结束了都会自动回到 start 状态如果 start 时是关的则回到关闭状态如果是开启状态则会到开启状态。
Commit; 提交 rollback;失败
事务功能只在innodb 和DBD 存储引擎下生效;
Innodb 的并发性高于,DBD 因为innodb是行锁,DBD 为表锁。
事务的特性:
1.原子性。 事务中的多条语句不能分开成功都成功 一条失败则都失败。
2.一致性。 在使用事务时到事务结束时数据不能改变锁行。
3.隔离性。 如果同时有两个事务两个事务是没有影响的。
4.持久性。 事务提交后修改的数据不能回滚的事务前。