MySQL里面默认的事务是自动提交的。即执行SQL语句后就会马上执行COMMIT操作。因此我们要显示的开启一个事务实用命令BEGIN和START TRANSACTION,或者去执行AUTOCOMMIT=0,MySQL数据库默认的AUTOCOMMIT的值为1,表示默认为自动提交。下面我们来看看相关的事务控制语句:
1、START TRANSACTION | BEGIN
显示的开启一个事务。
2、COMMIT和COMMIT WORK
在completion_type=0时,两者一样的效果。但是当completion_type=1时,两者效果存在区别,为1时,COMMIT WORK等同于COMMIT AND CHAIN,开启一个链事务。当completion_type=2时,COMMIT WORK等同于COMMIT AND RELEASE,当事务提交后就会自动断开于服务器的链接。
3、ROLLBACK和ROLLBACK WORK
回滚
4、SAVEPOINT identifier:
保存节点
5、RELEASE SAVEPOINT identifier
释放节点信息,通常与控制语句SAVEPOINT identifier一起用。如果没有相应的节点则会返回一个错误。
6、ROLLBACK TO [SAVEPONT] indentifier
回滚道相应的节点
7、SET TRANSACTION
用来设置事务的隔离级别
8、案例分析:
EG1::
(1)create table t( a intm primary key(a) ); (2)set @@completion_type=1; (3)BEGIN; (4)INSER INTO t value(1); (5)COMMIT WORK; (6)INSER INTO t value(2); (7))INSER INTO t value(1); (8)ROLLBACK (9)SELECT * FROM t;
completion_type设置为1,表示COMMIT WORK会自动开启一个链事务,所以在7会提示重复主键,而回滚后第一个2也没有插入到表中去。
EG2:
(1) set @@completion_type=3; (2) BEGN; (3)INSER INTO t value(3); (4)COMMIT WORK; (5) select @@version \G;
执行第(5)时,我们会发现有错误,事实上是因为执行第(4)后,会断开链接。
EG3:
ROLLBACKTO SAVEPOINT命令并不是真正地结束了事务,如果此时查询结果,在此之前如果没有提交的事务也不会得到提交,查询相应的数据会发现数据库里面没有你想要的数据。
写于2013年10月24日