MYSQL 事务处理主要有两种方法
1、用 begin, rollback, commit 来实现
begin 或/ start transaction )开始一个事务
rollback 事务回滚
commit 事务确认
2、直接用 SET 来改变 MySQL 的自动提交模式:
set autocommit=0 禁止自动提交
set autocommit=1 开启自动提交
1.不管 autocommit 是1还是0
start transaction 后,只有当 commit 数据才会生效, rollback 后就会回滚。
2、当 autocommit 为 0 时
不管有没有 start transaction .
只有当 commit 数据才会生效, rollback 后就会回滚。
3、如果 autocommit 为1 ,并且没有 start transaction .
调用 rollback 是没有用的。因为事务已经自动提交了。
事务测试1
事务测试2
flag 相当一定义这个保存点的名字
savepoint flag : savepoint 允许在事务中创建一个保存点,一个事务中可以有多个savepoint ;
release savepoint flag :删除一个事务的保存点,当没有指定的保存点时,执行该语句会抛出一个异常;
rollback to flag :把事务回滚到标记点;
set transaction :用来设置事务的隔离级别。InnoDB存储引擎提供事务的隔离级别有
READ UNCOMMITTED 、 READ COMMITTED 、 REPEATABLE READ 和 SERIALIZABLE
select @@transaction_isolation
SELECT @@SESSION.transaction_isolation, @@SESSION.transaction_read_only
您好,我来为您解答:CREATE DEFINER=`root`@`localhost` PROCEDURE `createBusiness`(parameter1 int)
BEGIN
#Routine body goes here...
DECLARE flag int DEFAULT parameter1#声明变量flag,将参数值赋给该变量
DECLARE uuidStr VARCHAR(32)#声明一个长度为32位的字符串
DECLARE currentTime TIMESTAMP#声明一个类型为时间戳的变量
declare err INT default 0#声明一个整形变量err,默认值是0
declare continue handler for sqlexception set err=1#当sqlexception handler捕捉到异常时,设置err=1
START TRANSACTION#开始事务
WHILE flag>0 DO #注意: while不能空实现(在while块中,里面必须有语句)
#uuid()函数得到的字符串是'6ccd780c-baba-1026-9564-0040f4311e29',剔除里面的-,得到一个32位的字符串
SET uuidStr = REPLACE(UUID(),'-','')
#得到当前的时间
SET currentTime = CURRENT_TIMESTAMP()
#执行插入语句,注意连接字符串的函数concat(str1,str2,...)其中str..也可以是数字类型
INSERT INTO
表名称
(id,title,keyword,hasImage,isTodayHead,isShowInHome,isBigness,publishTime,originId,modify_time,isAnalysis)
VALUE
(uuidStr,CONCAT('事件标题',flag),CONCAT('关键字',flag),1,1,0,0,currentTime,CONCAT('xxxxxxx',flag),currentTime,1)
#每循环一次,flag要减去1,注意没有flag--的语法
set flag = flag-1
#在这里测试当err=1时,事务是否有了回滚,测试ok
#IF flag=7 THEN #注意在procedure中给变量赋值要用到set,或在变量声明时用default来父子,所以=号可以用来比较两边的值是否相等,<=>也可,区别先不去纠结。
#set err=1
#END if
END WHILE
IF (err=0) THEN
commit
select 'OK'
ELSE
rollback
select 'err'
END IF
END
如果我的回答没能帮助您,请继续追问。
先简单介绍一下事务吧!事务是DBMS得执行单位。它由有限得数据库 *** 作序列组成得。但不是任意得数据库 *** 作序列都能成为事务。一般来说,事务是必须满足4个条件(ACID)
原子性(Autmic):事务在执行性,要做到“要么不做,要么全做!”,就是说不允许事务部分得执行。即使因为故障而使事务不能完成,在rollback时也要消除对数据库得影响!
一致性(Consistency):事务得 *** 作应该使使数据库从一个一致状态转变倒另一个一致得状态!就拿网上购物来说吧,你只有即让商品出库,又让商品进入顾客得购物篮才能构成事务!
隔离性(Isolation):如果多个事务并发执行,应象各个事务独立执行一样!
持久性(Durability):一个成功执行得事务对数据库得作用是持久得,即使数据库应故障出错,也应该能够恢复!
MYSQL的事务处理主要有两种方法。
1、用begin,rollback,commit来实现
begin
开始一个事务
rollback 事务回滚
commit 事务确认
2、直接用set来改变mysql的自动提交模式
MYSQL默认是自动提交的,也就是你提交一个QUERY,它就直接执行!我们可以通过
set autocommit=0
禁止自动提交
set autocommit=1 开启自动提交
来实现事务的处理。
但注意当你用 set
autocommit=0
的时候,你以后所有的SQL都将做为事务处理,直到你用commit确认或rollback结束,注意当你结束这个事务的同时也开启了个新的事务!按第一种方法只将当前的作为一个事务!
个人推荐使用第一种方法!
MYSQL中只有INNODB和BDB类型的数据表才能支持事务处理!其他的类型是不支持的!(切记!)
下次有空说下MYSQL的数据表的锁定和解锁!
MYSQL5.0 WINXP下测试通过~ ^_^
mysql>use test
Database
changed
mysql>CREATE TABLE `dbtest`(
->id int(4)
->) TYPE=INNODB
Query OK, 0 rows affected, 1 warning (0.05
sec)
mysql>select * from dbtest
->
Empty set (0.01
sec)
mysql>begin
Query OK, 0 rows affected (0.00
sec)
mysql>insert into dbtest value(5)
Query OK, 1 row affected
(0.00 sec)
mysql>insert into dbtest value(6)
Query OK, 1 row
affected (0.00 sec)
mysql>commit
Query OK, 0 rows affected (0.00
sec)
mysql>select * from dbtest
+------+
| id
|
+------+
| 5 |
| 6 |
+------+
2 rows in set (0.00
sec)
mysql>begin
Query OK, 0 rows affected (0.00
sec)
mysql>insert into dbtest values(7)
Query OK, 1 row affected
(0.00 sec)
mysql>rollback
Query OK, 0 rows affected (0.00
sec)
mysql>select * from dbtest
+------+
| id
|
+------+
| 5 |
| 6 |
+------+
2 rows in set (0.00
sec)
mysql>
*******************************************************************************************************************
[PHP]
function
Tran( $sql ) {
$judge = 1
mysql_query('begin')
foreach ($sql as $v) {
if
( !mysql_query($v) ) {
$judge =
0
}
}
if ($judge == 0)
{
mysql_query('rollback')
return
false
}
elseif ($judge == 1) {
mysql_query('commit')
return true
}
}
[/PHP]
************************************************
<?php
$handler=mysql_connect("localhost","root","")
mysql_select_db("task")
mysql_query("SET
AUTOCOMMIT=0")//设置为不自动提交,因为MYSQL默认立即执行
mysql_query("BEGIN")//开始事务定义
if(!mysql_query("insert
into trans (id)
values('2')"))
{
mysql_query("ROOLBACK")//判断当执行失败时回滚
}
if(!mysql_query("insert
into trans (id)
values('4')"))
{
mysql_query("ROOLBACK")//判断执行失败回滚
}
mysql_query("COMMIT")//执行事务
mysql_close($handler)
?>
引自:http://www.cnblogs.com/in-loading/archive/2012/02/21/2361702.html
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)