MYSQL select时锁定记录问题
来源:互联网 发布:java包装简历 编辑:程序博客网 时间:2024/05/16 12:45
转自:http://blog.sina.com.cn/s/blog_5755b8ed0101dn6f.html
在使用SQL时,大都会遇到这样的问题,你Update一条记录时,需要通过Select来检索出其值或条件,然后在通过这个值来执行修改操作。
但当以上操作放到多线程中并发处理时会出现问题:某线程select了一条记录但还没来得及update时,另一个线程仍然可能会进来select到同一条记录。
一般解决办法就是使用锁和事物的联合机制:
如:
1. 把select放在事务中, 否则select完成, 锁就释放了。
2. 要阻止另一个select, 则要手工加锁,select 默认是共享锁, select之间的共享锁是不冲突的, 所以, 如果只是共享锁, 即使锁没有释放, 另一个select一样可以下共享锁, 从而select出数据。
BEGIN TRAN
SELECT * FROM table WITH(TABLOCKX)
或者 SELECT * FROM table WITH(UPDLOCK, READPAST) 具体情况而定。
UPDATE ....
COMMIT TRAN
锁描述:
HOLDLOCK:将共享锁保留到事务完成,而不是在相应的表、行或数据页不再需要时就立即释放锁。HOLDLOCK 等同于 SERIALIZABLE。
NOLOCK 不要发出共享锁,并且不要提供排它锁。当此选项生效时,可能会读取未提交的事务或一组在读取中间回滚的页面。有可能发生脏读。仅应用于 SELECT 语句。
PAGLOCK:在通常使用单个表锁的地方采用页锁。
READCOMMITTED:用与运行在提交读隔离级别的事务相同的锁语义执行扫描。默认情况下,SQL Server 2000 在此隔离级别上操作。
READPAST:跳过锁定行。此选项导致事务跳过由其它事务锁定的行(这些行平常会显示在结果集内),而不是阻塞该事务,使其等待其它事务释放在这些行上的锁。 READPAST 锁提示仅适用于运行在提交读隔离级别的事务,并且只在行级锁之后读取。仅适用于 SELECT 语句。
READUNCOMMITTED:等同于 NOLOCK。
REPEATABLEREAD:用与运行在可重复读隔离级别的事务相同的锁语义执行扫描。
ROWLOCK:使用行级锁,而不使用粒度更粗的页级锁和表级锁。
SERIALIZABLE:用与运行在可串行读隔离级别的事务相同的锁语义执行扫描。等同于 HOLDLOCK。
TABLOCK:使用表锁代替粒度更细的行级锁或页级锁。在语句结束前,SQL Server 一直持有该锁。但是,如果同时指定 HOLDLOCK,那么在事务结束之前,锁将被一直持有。
TABLOCKX 使用表的排它锁。该锁可以防止其它事务读取或更新表,并在语句或事务结束前一直持有。
UPDLOCK:读取表时使用更新锁,而不使用共享锁,并将锁一直保留到语句或事务的结束。UPDLOCK:的优点是允许您读取数据(不阻塞其它事务)并在以后更新数据,同时确保自从上次读取数据后数据没有被更改。
XLOCK:使用排它锁并一直保持到由语句处理的所有数据上的事务结束时。可以使用 PAGLOCK 或 TABLOCK 指定该锁,这种情况下排它锁适用于适当级别的粒度。
- MYSQL select时锁定记录问题
- MYSQL select时锁定记录问题
- select时锁定记录问题
- MYSQL调度与锁定问题
- MYSQL调度与锁定问题
- 锁定记录
- mysql update select 问题
- MySQL的锁定读SELECT ... FOR UPDATE和SELECT ... LOCK IN SHARE MODE
- MySQL学习足迹记录02--SELECT
- oracle查询记录时,对记录进行update锁定
- oracle查询记录时,对记录进行update锁定
- 锁定问题
- mysql 表锁定,库锁定
- MySQL插入记录时 ERROR:1366 问题
- MySQL问题记录(一)
- mysql一些问题记录
- mysql并发问题记录
- Mysql问题记录笔记
- Android attr 自定义过程出现的错误
- ASIHTTPRequest简单使用说明
- Ubuntu上安装Nessus
- C++实现软件版本号管理类
- ArcGIS教程:Geostatistical Analyst 应用示例
- MYSQL select时锁定记录问题
- Android Studio http://schemas.android.com/apk/res/android “URI is not registered”解决方案
- 自定义ContentProvider以及ContentObserver的使用完整详细示例
- QAuth2认证 -- ( 不使用友盟等 )自己实现第三方登录(UIWebView)、微博分享、等其他操作
- Removing Columns - CodeForces 496 C 水题
- 早来的圣诞礼物!--android 逆向菜鸟速参手册完蛋版
- 客户端升级架构
- 【C语言】递归实现元素的全排列和子集
- Project Eluer - 20