由于InnoDB预设是Row-Level Lock,所以只有「明确」的指定主键,MySQL才会执行Row lock (只锁住被选取的资料例) ,否则MySQL将会执行Table Lock (将整个资料表单给锁住)。
举个例子:
假设有个表单products ,里面有id跟name二个栏位,id是主键。
例1: (明确指定主键,并且有此笔资料,row lock)
SELECT * FROM products WHERE id='3' FOR UPDATE;
例2: (明确指定主键,若查无此笔资料,无lock)
SELECT * FROM products WHERE id='-1' FOR UPDATE;
例2: (无主键,table lock)
SELECT * FROM products WHERE name='Mouse' FOR UPDATE;
例3: (主键不明确,table lock)
SELECT * FROM products WHERE id<>'3' FOR UPDATE;
例4: (主键不明确,table lock)
SELECT * FROM products WHERE id LIKE '3' FOR UPDATE;
注1: FOR UPDATE仅适用于InnoDB,且必须在交易区块(BEGIN/COMMIT)中才能生效。
注2: 要测试锁定的状况,可以利用MySQL的Command Mode ,开二个视窗来做测试。
因为jdk对进程间的线程同步支持的不好,所以我们只有用一些其他的方式来实现进程间的线程同步。(至于为什么要进程间的线程同步,是因为server做多台服务器的集群的时候,要求某些线程同步)根据上面的说法我们可以利用数据库的行锁来实现。
具体的实现如下 :
1、执行一个查询语句SELECT * FROM products WHERE id='3' FOR UPDATE;
2、执行上面语句后,之后所有对该行的操作都会被阻塞,只有该事务中才可以对这行数据进行操作。直到该事务提交或者超时之后其他阻塞线程才会执行。
3、要注意的是需要同步的操作必须放在一个事务当中。
由上面的InnoDB 已经交易区块引出两个问题。
1. what is InnoDB?
MySQL是我们比较常用的一种数据库软件。它有着诸多的优点,如开源的,免费的等等。其实它还有一个很好的特点,那就是有多种引擎可以供你选择。如果赛车手能根据不同的路况,地形随手更换与之最适宜的引擎,那么他们将创造奇迹。然而目前他们还做不到那样便捷的更换引擎,但是我们却可以!
所谓知己知彼方可百战不殆,要想将它们发挥到极致,首先我们应该来认识一下MySQL提供给我们的这几种引擎。
一般来说,MySQL有以下几种引擎:ISAM、MyISAM、HEAP、InnoDB和Berkley(BDB)。注意:不同的版本支持的引擎是有差异的。
进一步:
如何查看MySQL的当前存储引擎?
一般情况下,mysql会默认提供多种存储引擎,你可以通过下面的查看:
看你的mysql现在已提供什么存储引擎:
mysql> show engines;
以上说明我的mysql默认使用的InnoDB引擎,并且支持MyISAM,memory,archive,Mrg_myisam。
后面还跟着解释, InnoDB 的解释是:支持事务,行级别锁定,外键。
看你的mysql当前默认的存储引擎:
mysql> show variables like '%storage_engine%';
你要看某个表用了什么引擎(在显示结果里参数engine后面的就表示该表当前用的存储引擎):
mysql> show create table 表名;
其实这是一定的,因为我的mysql引擎就是InnoDB,默认情况下创建的表当前也是以InnoDB为引擎的喽
2. what is 交易区块?
参考:http://hi.baidu.com/cuihu0706/blog/item/1dd6ccb1621c355709230278.html
事务处理在各种管理系统中都有着广泛的应用,比如人员管理系统,很多同步数据库操作大都需要用到事务处理。比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务!
删除的SQL语句
delete from userinfo where ~~~
delete from mail where ~~
delete from article where~~
~~
如果没有事务处理,在你删除的过程中,假设出错了,只执行了第一句,那么其后果是难以想象的!
但用事务处理。如果删除出错,你只要rollback就可以取消删除操作(其实是只要你没有commit你就没有确实的执行该删除操作) 一般来说,在商务级的应用中,都必须考虑事务处理的!
MYSQL数据库从4.1就开始支持事务功能,据说5.0将引入存储过程^_^
先简单介绍一下事务吧!事务是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类型的数据表才能支持事务处理!其他的类型是不支持的!(切记!)
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>
既然已经知道了相关的知识,那么下面就用for update来锁定行,进行试验
以上例中student表为例,
1. 使用begin开始一个事务
2. 利用select * for update 锁定行,
3. 在新窗口中验证非选中行是否被锁定 ----未被锁定
4. 在新窗口中验证选中行是否被锁定 -----锁定,update语句在等待了一段时间后失败。
分享到:
相关推荐
它能够实现异构数据库系统之间的数据迁移、同步和复制。GoldenGate具备日志挖掘(log mining)技术,可以捕获源数据库的事务日志,将这些日志变化应用到目标数据库,从而实现数据的一致性。 ### Oracle向MySQL同步...
3. **分布式锁**:在分布式系统中,由于进程间的内存不可见,需要一种跨节点的协调机制来实现锁。常见的分布式锁实现有Zookeeper、Redis的setnx命令、RedLock算法等。 4. **可重入锁**:可重入锁允许一个线程获取...
金桥 Oracle 到 MySQL 同步配置手册主要讲述了如何使用 Oracle GoldenGate 技术实现在异构数据库间进行数据同步,具体来说就是从 Oracle 数据库同步到 MySQL 数据库。这一过程适用于多种场景,比如读写分离、灾备等...
通常在我们进行多进程应用开发的过程中,不可避免的会遇到多个进程访问同一个资源(临界资源)的状况,这时候必须通过加一个全局性的锁,来实现资源的同步访问(即:同一时间里只能有一个进程访问资源)。...
MySQL通常由服务器进程、客户端库、日志文件、数据文件和系统表空间组成。服务器进程处理客户端的请求,而客户端库负责与服务器通信。日志文件(如二进制日志和错误日志)记录操作历史,数据文件存储表数据,系统表...
MySQL的同步功能,也称为复制或Replication,是一种强大的工具,允许数据从一个服务器(主服务器,Master)实时地复制到另一个服务器(从服务器,Slave)。这种机制在高可用性、故障恢复、负载均衡和数据备份等方面...
进程间通信是操作系统中多进程协同工作的重要...信号量和信号用于进程同步和异常处理;Socket则适用于网络通信。选择哪种通信方式取决于具体应用的需求和场景。在实际编程中,通常会结合使用多种机制以达到最佳效果。
其核心在于利用分布式协调服务(如ZooKeeper、Redis等)提供的一致性数据存储和同步机制来实现锁的功能。 - **互斥性**:确保同一时间内只有一个进程或线程能够获取锁,从而能够对共享资源进行操作。 - **可重入性*...
8.7. mysqlcheck:表维护和维修程序 8.8. mysqldump:数据库备份程序 8.9. mysqlhotcopy:数据库备份程序 8.10. mysqlimport:数据导入程序 8.11. mysqlshow-显示数据库、表和列信息 8.12. myisamlog:显示MyISAM...
8.7. mysqlcheck:表维护和维修程序 8.8. mysqldump:数据库备份程序 8.9. mysqlhotcopy:数据库备份程序 8.10. mysqlimport:数据导入程序 8.11. mysqlshow-显示数据库、表和列信息 8.12. myisamlog:显示MyISAM...
综上所述,MySQL双机热备份通过复制技术实现数据的实时同步,结合适当的故障转移策略,能够显著提高系统的可用性和稳定性。在实际部署过程中,需要根据业务特性和需求选择适合的复制模式,并持续优化和完善备份策略...
10. **复制与高可用性**:MySQL 支持主从复制,通过在多个服务器间同步数据,可以提高系统的可用性和容错能力。 11. **网络通信**:MySQL 可以通过 TCP/IP、Unix 域套接字、命名管道(Windows 特有)等多种方式与...
Oracle GoldenGate(OGG)12c是一种实时数据复制解决方案,用于在数据库之间实现低延迟的数据同步。在本案例中,我们将关注如何使用OGG 12c搭建一个从MySQL到MySQL的数据复制环境,即Mysql2Mysql的配置。Oracle ...
8.7. mysqlcheck:表维护和维修程序 8.8. mysqldump:数据库备份程序 8.9. mysqlhotcopy:数据库备份程序 8.10. mysqlimport:数据导入程序 8.11. mysqlshow-显示数据库、表和列信息 8.12. myisamlog:显示MyISAM...
8.7. mysqlcheck:表维护和维修程序 8.8. mysqldump:数据库备份程序 8.9. mysqlhotcopy:数据库备份程序 8.10. mysqlimport:数据导入程序 8.11. mysqlshow-显示数据库、表和列信息 8.12. myisamlog:显示MyISAM...
数据库进程间通信解决方案是针对数据库系统与其他第三方应用程序之间需要实时同步数据或触发特定操作的场景。传统的查询方式可能无法满足这种实时性需求,因此需要设计一种机制,使得数据库能够主动通知其他进程数据...
8.7. mysqlcheck:表维护和维修程序 8.8. mysqldump:数据库备份程序 8.9. mysqlhotcopy:数据库备份程序 8.10. mysqlimport:数据导入程序 8.11. mysqlshow-显示数据库、表和列信息 8.12. myisamlog:显示MyISAM...
10-mysql进程-状态-在线修改参数重要知识讲解.avi 11-mysqlbinlog命令介绍及实战讲解.avi 12-mysqldump-master-data参数答疑详解.avi 第六部 MySQL主从复制原理及实战部署(10节) 01-由架构因为引出主从复制的作用...
8.7. mysqlcheck:表维护和维修程序 8.8. mysqldump:数据库备份程序 8.9. mysqlhotcopy:数据库备份程序 8.10. mysqlimport:数据导入程序 8.11. mysqlshow-显示数据库、表和列信息 8.12. myisamlog:显示...
- MySQL服务器在操作系统上以一个后台进程运行,可以通过命令行或者图形界面工具启动和停止。 - 在Unix/Linux系统中,通常使用`sudo service mysql start/stop/restart`命令来管理MySQL服务。 - 在Windows系统中...