您的位置:首页 > 数据库 > MySQL

MySQL 事务的隔离级别与锁

2015-11-03 00:00 676 查看
#一
#隔离级别, 多笔交易,保持数据的安全性等
#四中隔离级别
SERIALIZABLE :等待别的提交了,才能提交 (如果打开多个操作)
REPEATABLE READ (mysql 默认的隔离级别)
READ COMMITTED (oracle 默认隔离级别)
READ UNCOMMITTED
#查看隔离级别
SELECT @@global.tx_isolation,@@session.tx_isolation ;
#设置隔离级别
SET SESSION TRANSACTION isolaion LEVEL SERIALIZABLE
#(1)操作
SET sessoin TRANSACTION ISOLATION LEVEL SERIALIZABLE ;
START TRANSACTION ;
SELECT * FROM TABLE ;
INSERT INTO TABLE (XX,XX) VALUES(1,2);
commit;
#(2)操作
START TRANSACTION ;
SELECT * FROM TABLE ;
INSERT INTO TABLE (XX,XX) VALUES(1,2);
commit;
#解释 如果操作1 没有commit 之前,操作2就进行了,会导致,操作2无法进行,因为隔离级别是serializable序列化隔离级别(等待之前commit)
#二
#可重复读REPEATABLE READ ,提交读 READ COMMITTED, 未提交读READ UNCOMMITTED
#REPEATABLE READ 修改
SET sessoin TRANSACTION ISOLATION LEVEL SERIALIZABLE ;
#操作1
START TRANSACTION ;
SELECT * FROM TABLE ;
INSERT INTO .....插入数据
COMMIT;
#操作2
START TRANSACTION ;
SELECT * FROM TABLE ;
update。。。。
COMMIT;
#解释,假如操作1新增一条,操作而操作而没做提交,只是和操作1同时打开窗口的,数据会缺少插入的数据,但是最终结果会显示
1 2
2 3
插入了 3 1
如果进行update会变成
1 3
2 4
3 2
多了一个 3 2
#提交读
就是两个操作,只显示提交了的数据
#未提交读
就是没commit的数据也可以读取的

#三mysql性能与非事务表的表锁定
建议
使用小事务
选择合适的隔离级别
保证开始事务前一切都是可行的
避免死锁
#非事务性表锁
#(1)读锁定 大家都能读,但是都不能写
LOCK TABLE tablename READ ; //很多种锁定方式 这里介绍read WRITE
INSERT INTO tablename VALUES(1 ,2 );提示锁定了,但是可以进行读取数据的
#(2)写锁定 自己可以读可以写,其他的都干不了
LOCK TABLE tablename WRITE;
#解锁
UNLOCK TABLES ;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: