`
junpub
  • 浏览: 10013 次
社区版块
存档分类
最新评论

mysql的事务处理与锁表

阅读更多

数据库的事务处理可以保证一组处理结果的正确性。mysql中只有INNODB和BDB引擎的数据表才支持事务处理,对于不支持事务的MyISAM引擎数据库可以使用表锁定的方法来实现相同的功能。

mysql的事务处理主要有两种方法来实现。

1、用begin,rollback,commit来实现。

begin 开始一个事务

rollback 事务回滚

commit 事务确认

$conn = mysql_connect('localhost','root','root') or die ("数据连接错误!!!");
mysql_select_db('test',$conn);
mysql_query("set names 'utf8'");
//开始一个事务
mysql_query("BEGIN"); //或者mysql_query("START TRANSACTION");
$sql = "INSERT INTO `t_user` (`id`, `username`, `sex`) VALUES (NULL, 'test1', '0')";
$sql2 = "INSERT INTO `t_user` (`did`, `username`, `sex`) VALUES (NULL, 'test1', '0')";//这条是故意写错
$res = mysql_query($sql);
$res1 = mysql_query($sql2);
if($res && $res1){
mysql_query("COMMIT");
echo '提交成功。';
}else{
mysql_query("ROLLBACK");
echo '数据回滚。';
}
mysql_query("END");

 

2、直接用set来改变mysql的自动提交模式

MYSQL默认是自动提交的,也就是你提交一个QUERY,它就直接执行!我们可以通过

set autocommit=0 禁止自动提交

set autocommit=1 开启自动提交

$conn = mysql_connect('localhost','root','root') or die ("数据连接错误!!!");
mysql_select_db('test',$conn);
mysql_query("set names 'utf8'");
mysql_query("SET AUTOCOMMIT=0"); //设置mysql不自动提交,需自行用commit语句提交
$sql = "INSERT INTO `t_user` (`id`, `username`, `sex`) VALUES (NULL, 'test1', '0')";
$sql2 = "INSERT INTO `t_user` (`did`, `username`, `sex`) VALUES (NULL, 'test1', '0')";//这条故意写错
$res = mysql_query($sql);
$res1 = mysql_query($sql2); 
if($res && $res1){
mysql_query("COMMIT");
echo '提交成功。';
}else{
mysql_query("ROLLBACK");
echo '数据回滚。';
}
mysql_query("END"); //事务处理完时别忘记mysql_query("SET AUTOCOMMIT=1");自动提交

 

对于不支持事务的MyISAM引擎数据库可以使用表锁定的方法来实现

MyISAM & InnoDB 都支持,LOCK TABLES可以锁定用于当前线程的表。如果表被其它线程锁定,则造成堵塞,直到可以获取所有锁定为止。
UNLOCK TABLES可以释放被当前线程保持的任何锁定。当线程发布另一个LOCK TABLES时,或当与服务器的连接被关闭时,所有由当前线程锁定的表被隐含地解锁。

mysql_query("LOCK TABLES `t_user` WRITE");//锁住`user`表
$sql = "INSERT INTO `t_user` (`id`, `username`, `sex`) VALUES (NULL, 'test1', '0')";
$res = mysql_query($sql);
if($res){
echo '提交成功。!';
}else{
echo '失败!';
}
mysql_query("UNLOCK TABLES");//解除锁定

 

如果操作表比较多,采用断点调试的时候,在事务处理完成之前(COMMIT)查看数据库的相关表是看不到表中数据的变化的。

下面是在mysql存储过程中使用事务处理的一个例子。

CREATE PROCEDURE TransTest(in p1 VARCHAR(20),in p2 VARCHAR(50))
BEGIN
declare err int default 0;  
 /*如果出现sql异常,则将err设置为1后继续执行后面的操作 */  
declare continue handler for sqlexception set err=1; -- 出错处理  
set autocommit = 0;
insert into sy_queryconfig(syq_id) values(p1); 
insert into sy_queryconfig(syq_id) values(p2); 
if err=1 then  
 ROLLBACK;
ELSE
 COMMIT;
end if;
END

 

PS:附加一个mysql数据库在delete表数据的时候,不能用别名操作,例如:

delete from t_user where id in (1,2);//此写法正确
delete from t_user t where t.id in (1,2);//此写法错误

mysql就是这么任性!

分享到:
评论

相关推荐

    MySQL锁类型以及子查询锁表问题、解锁1

    在MySQL中,主要存在两种类型的锁:行级锁(Row-Level Locks)和表级锁(Table-Level Locks)。InnoDB存储引擎默认支持行级锁,而MyISAM只支持表级锁。 行级锁能提供更高的并发性能,因为它只锁定操作影响的具体行...

    Mysql事务以及锁原理讲解.pdf

    在深入探讨MySQL事务和锁的原理之前,我们首先需要对“事务”的概念有一个基本的理解。事务是一组操作的集合,这些操作要么全部完成,要么全部不做,确保数据库从一种一致性状态转换到另一种一致性状态,而不会留下...

    06-VIP-深入理解Mysql事务隔离级别与锁机制.pdf

    深入理解Mysql事务隔离级别与锁机制 Mysql事务隔离级别与锁机制是数据库系统中非常重要的概念,它们都是为了解决多事务并发问题而设计的。下面我们将深入讲解这些机制,让大家彻底理解数据库内部的执行原理。 事务...

    MYSQL锁表问题的解决方法

    总之,解决MySQL锁表问题需要综合运用多种策略,包括优化事务处理、选择合适的隔离级别、数据库设计优化以及实施监控和自动化处理。通过这些方法,可以有效减少锁表的发生,提高系统的稳定性和并发性能。

    MySQL基础架构与历史 数据类型与表设计 SQL语言基础 数据查询与筛选 索引与优化 存储引擎深入解析 事务处理与锁机制 视图

    事务处理与锁机制 视图与存储过程 触发器与事件调度 数据库备份与恢复 数据库安全与权限管理 数据库性能监控与调优 数据库集群与高可用性 MySQL与Web应用集成 大数据处理与MySQL 数据库迁移与同步技术 跨平台MySQL...

    mysql_innoDB 事务与锁详解

    ### MySQL_InnoDB 事务与锁详解 #### 引题:为何引入事务? 事务在数据库管理系统中扮演着极其重要的角色,其主要目的有三: 1. **数据完整性**:确保数据库中的数据始终保持一致性和正确性,避免因部分操作失败...

    Java实现的mysql事务处理操作示例

    本文主要介绍了Java实现的mysql事务处理操作,结合实例形式较为详细的分析了Java基于JDBC操作mysql数据库实现事务处理的相关概念、操作技巧与注意事项。 事务处理是数据库操作的一个执行单元,它是一组要么同时执行...

    深入剖析Oracle与MySQL在事务处理上的差异

    本文将从事务的基本概念、隔离级别、锁机制以及事务控制语句等方面,详细探讨Oracle与MySQL在事务处理上的差异,并提供代码示例。 Oracle和MySQL在事务处理上有着各自的特点。Oracle提供了强大的并发控制和隔离级别...

    详解Mysql事务隔离级别与锁机制.doc

    详解Mysql事务隔离级别与锁机制 本篇文章详细介绍了Mysql事务隔离级别与锁机制的概念、原理和应用。事务隔离级别是数据库系统中的一种机制,用于解决多事务并发问题,包括脏写、不可重复读、幻读等问题。锁机制是...

    mysql 锁表锁行语句分享(MySQL事务处理)

    MySQL中的锁机制是数据库事务处理中的重要组成部分,用于确保数据的一致性和完整性。在标题和描述中提到的“mysql 锁表锁行语句分享”是关于如何在MySQL中使用事务来锁定特定行数据,确保在操作期间不会被其他并发...

    MySQL事务处理详细讲解及完整实例

    本详细讲解将深入探讨MySQL事务处理的各个方面,并通过实例帮助你更好地理解和应用。 一、事务的基本特性 事务具有四大特性,也被称为ACID属性: 1. 原子性(Atomicity):事务中的所有操作要么全部完成,要么全部...

    mysql 事务处理学习资料+示例说明

    根据提供的文件信息,本文将详细解释MySQL事务处理的相关知识点,并结合具体的示例代码进行说明。 ### MySQL事务处理基础 在数据库操作中,事务处理是非常重要的一个环节,它能够确保数据的一致性和完整性。MySQL...

    Mysql事务以及锁原理讲解

    ### MySQL事务及锁原理详解 #### 一、事务的基本概念 事务(Transaction)是数据库操作的基本单位,一组逻辑上完整的工作单元。在事务中,一系列的操作要么全部完成,要么都不进行,确保了数据的一致性和可靠性。...

    MySQL数据库:锁定与解锁.pptx

    正确理解和使用`LOCK TABLES`和`UNLOCK TABLES`语句,以及注意与事务处理的协调,是MySQL数据库管理员必备的技能。通过实践和深入学习,你可以更有效地掌握这些概念,从而更好地管理和保护你的数据库资源。

    mysql中的事务、锁讲解和操作

    在MySQL中,事务支持ACID(原子性、一致性、隔离性和持久性)属性,确保了数据处理的正确性。 事务的隔离级别包括读未提交(Read Uncommitted)、读已提交(Read Committed)、可重复读(Repeatable Read)和串行化...

    Mysql事务的隔离性

    ### MySQL事务的隔离性 #### 一、事务与MySQL架构 **事务**是数据库管理系统执行过程中的一系列逻辑操作,这些操作作为一个完整的单元被执行。如果事务内的所有操作都成功完成,则整个事务成功;如果其中一个操作...

    mysql事务与锁机制(存储引擎和锁、MyISAM锁机制、InnoDB锁机制、Next-Key锁、Dead-Lock).docx

    ### MySQL事务与锁机制详解 #### 一、锁概念简介 **1、基础描述** 锁机制主要用于解决数据库中多线程或多个会话同时访问同一数据资源时出现的竞争问题。在MySQL中,锁机制是非常重要的组成部分之一,它与其他核心...

    MySQL数据库:事务与锁机制

    ### MySQL数据库:事务与锁机制 #### 一、事务的基础概念与特性 ##### 1. 事务的概念 事务(Transaction)是数据库操作的基本单位。它确保了一组操作要么全部成功,要么全部失败,从而保持数据的一致性和完整性。...

    MYSQL锁机制全揭秘

    InnoDB存储引擎则采用行级锁,开销较大,加锁慢,但由于锁定粒度小,因此并发度较高,支持事务处理。InnoDB的行级锁类型包括记录锁、间隙锁和临键锁等,主要用来减少锁争用,提高并发性。InnoDB支持多版本并发控制...

Global site tag (gtag.js) - Google Analytics