Chinaunix首页 | 论坛 | 博客
  • 博客访问: 104305
  • 博文数量: 20
  • 博客积分: 1486
  • 博客等级: 上尉
  • 技术积分: 205
  • 用 户 组: 普通用户
  • 注册时间: 2006-12-06 09:29
个人简介

平静

文章分类

全部博文(20)

文章存档

2010年(2)

2007年(6)

2006年(12)

我的朋友
最近访客

分类: Mysql/postgreSQL

2006-12-28 14:29:09

msyql事务与锁定
===========
start/commit/rollback
----------------------
commit提交,数据更改于磁盘文件
mysql默认是自动提交的,如果要使用事务安全表,修改set autocommit=0;
如:A给B1000块,当A减少了,但B没有增加,那就要rollback
要B也增加了,就应该是对的
mysql> set autocommit=0;
Query OK, 0 rows affected (0.01 sec)
 select @@autocommit                //全局系統變量用二個@(@@)表示
    -> ;
+--------------+
| @@autocommit |
+--------------+
|            0 |
+--------------+
1 row in set (0.02 sec)
事务是一个不可侵害的数据库单元,事务中的操作要么都发生,要么都不发生,事务
可以用start transaction定义
>start transaction;
Query OK, 0 rows affected (0.01 sec)
---
select @x:=sum(sal) from emp where deptno=10    //@表示臨時變量
update t set 1=@x;
commit;
----------------------
自动提交语句
----------------------
有些语句是无法回滚的,因为他们会自动提交,如:DDL语句,(create/drop
database,create/drop/alter table)事务中不要包含这些语句
下面命令自动的结束一个事务,(就好像你在执行这个命令之前,做了一个隐式提交
commit)
alter table  begin  create index   drop database   drop index  drop table
load master data  lock tables rename table
set autocommit=1  start tracaction  truncate table
---------------------
mysql savepoint
---------------------
start transaction;<-=-=-=-
... ...
insert
update...
if @account<0 then       ^
..                       |
rollback;-==-=-=-=-=-==-=|
endif
delete ...
... ...
commit;
==========
start transaction;
... ...
insert
savepoint s001  <-=-=-=-
update...
if @account<0 then       ^
..                       |
rollback s001;-==-=--==-=|
endif
delete ...
... ...
commit;
-----------------------
mysql加锁与解锁
-----------------------
也是用来完成並发性操作的
例如,网上订票系统,9:00如有一张了,A,B二个要买,如果不加以控制,可能二个
会都买不到
可考虑用锁来解决这样的问题
lock tables 表名[read][wirte],表名[read][wirte],......
lock tables 为当前线程锁定表。
使用lock tables,必须拥有一个全局的lock tables权限和一个在相关表上的select权
unlock tables
是释放当前线程拥有的所有锁定,当线程发出另一个lock tables,或当与服务器的连
接被关闭时,被当前线程锁定的所有表将被自动地解锁
-------
如果一个线程在一个表上得到一个read锁,该线程(和所有其它线程)只能从表中读
取,
如果一个线程在一个表上得到一个write锁,那么只有拥有这个锁的线程可以从表中读
取和写表,其他线程被阻塞
===
write锁通过比read锁有更高的权限,以确保write被尽快地处理。这就意味着,如果
一个线程请示获得一个read锁,而同时另外一个线程请求一个wirte锁,并发的read锁
请求将等待直到wirte线程得到了锁并释放了它
mysql>lock tables trans read,customer write;
mysql>select sun(value) from trans where customer_id=some_id;
mysql>update customer set total_value=sum_from_previous_statement
-> where customer_id=some_id;
mysql>unlock tables;
不使用lock tables,将可能发生在select和update语句执行期间有另外一个线程可能
在trans表中插入一行新记录
 
 

 
阅读(1939) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~