在有些情况下,我们的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.持久性。 事务提交后修改的数据不能回滚的事务前。