失效链接处理 |
数据库事务和锁机制 PDF 下载
本站整理下载:
相关截图:
主要内容:
事务:保护数据库数据可靠交易的安全机制
事务特性ACID:
1)原子性(Atomicity)原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
2)一致性(Consistency)一个事务中,事务前后数据的完整性必须保持一致。
3)隔离性(Isolation)多个事务,事务的隔离性是指多个用户并发访问数据库时, 一个用户的事务不能被其它用户的事务所干扰,多个并发事务之间数据要相互隔离。
4)持久性(Durability)持久性是指一个事务一旦被提交,它对数据库中数据的改变 就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。
并发访问问题----由隔离性引起
1)脏读:B事务读取到了A事务尚未提交的数据 ------ 要求B事务要读取A事务提交的数据
2)不可重复读:一个事务中两次读取的数据的内容不一致 ----- 要求的是一个事务中多次读取时数据是一致的 --- update
3)幻读/虚读:一个事务中 两次读取的数据的数量不一致 ----- 要求在一个事务多次读取的数据的数量是一致的 --insert delete
事务的隔离级别
1)read uncommitted : 读未提交 :最低级别,任何情况都无法保证。
2)read committed:读已提交 :可避免脏读的发生。 ---- oracle、sql server默认
3)repeatable read:可重复读:可避免脏读、不可重复读的发生。 ---mysql默认的
4)serializable:串行化:可避免脏读、不可重复读、幻读的发生---相当于锁表
在MySQL数据库中查看当前事务的隔离级别:
select @@tx_isolation;
设置事务的隔离级别:
set tx_isolation=’隔离级别名称’;
四个级别分别是:read-uncommitted read-committed repeatable-read
serializable
mysql的锁机制
1.悲观锁
悲观锁就是在操作数据时,认为此操作会出现数据冲突,所以在进行每次操作时都要通过获取锁才能进行对相同数据的操作,这点跟java中的synchronized很相似,所以悲观锁需要耗费较多的时间.
1.1排它锁
数据库的增删改操作默认都会加排他锁,而查询不会加任何锁。
排他锁:对某一资源加排他锁后,自身可以进行增删改查,其他人无法进行任何操作。
为select添加排它锁,语法为:
select * from goods_lock where id=1 for update ;
加上for update该查询语句假设执行了10秒钟,那么这10秒钟内其他人不能操作被锁
定的id为1的这条记录,增删改查,均不行,只能等查询结束后对该条记录添加的排它锁释
放后才可以操作.
注:oracle排它锁是:for update no wait;
1.2共享锁
数据库的增删改操作默认都会加排他锁,而查询不会加任何锁
共享锁:对某一资源加共享锁,自身可以读该资源,其他人也可以读该资源, 但无法修改。
要想修改就必须等所有共享锁都释放完之后。
为select添加共享锁,语法为:
select * from goods_lock where id=1 lock in share mode;
加上lock in share mode该查询语句如果执行了10秒钟,那么这10秒钟内其他人也可
以查询该上锁的id为1的记录,但是不能进行修改,只能等查询结束后对该条记录设置的
共享锁释放后才可以操作.
排它锁案例:有两条以上线程访问了数据库同一资源
T1: select * from goods_lock where id=1 for update ;
T2: update goods_lock set num=num-1 where id=1;
|