mysql中的事务
1.mysql中的innodb存储引擎才支持事务。
2.事务就是一组sql语句,只要全部的sql语句执行成功,事务才会提交(COMMIT),只要有一条sql语句执行失败,则事务不成功,需要回滚(rolback)。
3.对于事务而言,它需要满足ACID特性,下面就简要的说说事务的ACID特性。
1)A,表示原子性;原子性指整个数据库事务是不可分割的工作单位。只有使事务中所有的数据库操作都执行成功,整个事务的执行才算成功。事务中任何一个sql语句执行失败,那么已经执行成功的sql语句也必须撤销,数据库状态应该退回到执行事务前的状态;
2)C,表示一致性;也就是说一致性指事务将数据库从一种状态转变为另一种一致的状态,在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏;
3)I,表示隔离性;隔离性也叫做并发控制、可串行化或者锁。事务的隔离性要求每个读写事务的对象与其它事务的操作对象能相互分离,即该事务提交前对其它事务都不可见,这通常使用锁来实现;
4)D,持久性,表示事务一旦提交了,其结果就是永久性的,也就是数据就已经写入到数据库了,如果发生了宕机等事故,数据库也能将数据恢复。
4.默认的事务都是开启的 可以通过 set autocommit = 0取消自动提交事务。
5.可以为不同的地方设置回滚点
设置回滚点:save point 保存点名称;回滚到此:rollback 保存点名称;
6.案例
sql文件:
-- -- 数据库: `test` -- -- -------------------------------------------------------- -- -- 表的结构 `orders` -- CREATE TABLE IF NOT EXISTS `orders` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `num` int(10) unsigned NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=0 ; -- -- 表的结构 `goods` -- CREATE TABLE IF NOT EXISTS `goods` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `num` int(10) unsigned NOT NULL COMMENT '商品库存', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ; -- -- 转存表中的数据 `goods` -- INSERT INTO `goods` (`id`, `num`) VALUES (1, 100);
php文件:
<?php /* 事务测试 */ $handle = mysql_connect('localhost','root','root');//mysql中的外键 mysql_query('set names utf8');//设置字符集 mysql_query('use test');//选择数据库 mysql_query("SET AUTOCOMMIT=0");//设置事务不自定提交 mysql_query("BEGIN");//开启事务 $sql1 = "insert into orders(id,num) values(null,2)";//添加订单信息 if(!mysql_query($sql1)) { mysql_query('ROLLBACK');//判断当执行失败时回滚 exit; } $sql2 = "update goods set num = num - 2";//减少库存信息 if(!mysql_query($sql2)) { mysql_query('ROLLBACK');//判断当执行失败时回滚 exit; } mysql_query("COMMIT"); mysql_close($handle);
执行结果如下:
来源:https://www.cnblogs.com/bybelief/p/5201728.html