mysql 中的事务

来源:互联网 发布:文字解密软件 编辑:程序博客网 时间:2024/06/06 03:24

最近频繁的用到数据库的事务操作,虽然一直都知道事务是干嘛的,但总觉得了解的不是很清楚,所以在此做个记录。


1、事务的概念:简单来说,事务是一组sql语句,可以使一个sql,也可以是单个sql,当开启事务之后,要么都执行成功,提交数据库保存。要么就都失败,只要有一条失败则全部失败。

2、事务的四大特性:

   1)A,表示原子性;原子性指整个数据库事务是不可分割的工作单位。只有使事务中所有的数据库操作都执行成功,整个事务的执行才算成功。

事务中任何一个sql语句执行失败,那么已经执行成功的sql语句也必须撤销,数据库状态应该退回到执行事务前的状态;

   2)C,表示一致性;也就是说一致性指事务将数据库从一种状态转变为另一种一致的状态,在事务开始之前和事务结束以后,数据库的完整性约束没有

被破坏;

   3)I,表示隔离性;隔离性也叫做并发控制、可串行化或者锁。事务的隔离性要求每个读写事务的对象与其它事务的操作对象能相互分离,

即该事务提交前对其它事务都不可见,这通常使用锁来实现;

   4)D,持久性,表示事务一旦提交了,其结果就是永久性的,也就是数据就已经写入到数据库了,如果发生了宕机等事故,数据库也能将数据恢复。

3、常用的,支持事务的mysql表引擎为InnoDB ,而MyIsAM不支持事务操作,更改数据表的引擎:

alter table table-name engine=innoDB

4、在mysql 命令行中,查询系统配置变量:

show variables like %commit% (这个语句常用来查询数据库的提交配置)

5、开启自动提交:set autocommit=1;(防止回滚时,造成数据错乱)

关闭自动提交:set autocommit=0;

6、关于表锁定:对于不支持事务的存储引擎MYISAM类型数据表,当用户插入,修改,删除时,这些操作都会立即保存到磁盘中,
当多用户同时操作某个表时,可以使用表锁定来避免同一时间有多个用户对数据库中指定表进行操作,
这样可以避免在用户操作数据表过程中受到干扰。只有但用户释放表的操作锁定后,其他 用户才可以访问这些修改的数据表。

单个表锁定的操作:lock table table-name lock type; lock type一般有read和write

多个表锁定:lock table table-name1 lock type,table-name2 lock type,table-name3 lock type;

如果操作完成之后需要释放锁则:unlock tables ;  //释放了所有加锁表的锁。

7.关于回滚点的问题:

设置回滚点:save point 保存点名称;
回滚到此:rollback 保存点名称;
(设置回滚点可以保证前面的正确的操作还在,后边失误的或者不想要的操作则rollback,适用于比较大的场面,很方便)

8、有个例子不错,借鉴一下:

<?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);

原创粉丝点击