数据库的隔离级别

关于数据库的事务的特性(ACID):
1:atomicity(原子性):多个操作为一个单元不可分割,要么都成功要么都失败.
2:consitency(一致性):事务结束后,系统的状态是一致的。(一致性处理数据库中所有约束保护)
例如:如果2个表有主外键约束,如果我要删除主表的数据,那么从表的数据也应该被删除.
3:isolation(隔离性):保护2个同时进行的事务,彼此间无法看到中间结果.
例如:如果有个2个事务,A,B,如果A中的数据还没有提交,在B这个事务中是无法看到A所处理过程中的数据变化的。
4:durability(稳定性):保证数据更新时免遭破坏,保证数据能写正确到数据库的文件中。

数据库的隔离级别:
[table]
| 名称 ||脏读||不可重复读||幻读||锁级别||性能|
|read_uncommitted|| Y || Y || Y || 无 ||最好|
|read_committed|| N || Y || Y || 行级锁 ||其次|
|repeatable_read|| N || N || Y || 行级锁 ||较差|
|Serializable|| N || N || N || 表级锁 ||最差|
[/table]

不可重复读:
假如我有一个页面,一次性读取了5条数据,其中其中有一列值为123,可能下一次刷新的时候这列的值就变成345了(别人修改了这个数据),这个就叫做不可重复读,因为以前的值不见了。

幻读:
幻读主要是面向新增特性的,假如我有一个页面一次性可以展示10条,第一次刷新的时候可能只有5条,第二次刷新的时候,就出现了10条,另外的5条就是别人通过应用新增进来的,这种就叫幻读。

如在Hibernate中的给出的并发解决方案,悲观锁和乐观锁,其实就是相对隔离级别来说的。
乐观锁:相当于隔离级别的read_committed
悲观锁:相当于隔离级别的Serializable


事务的传播特性:
主要是用来描述事务的属性,事务的属性有6种:
1:Required
如果客户端有事务那么久加入该事务,如果没有事务则新启一个事务。

例如:
A{
void a1()
{
tx=*****.getTransaction();

B.b1();

}


}


B{
void b1()
{

//如果没有事务,则自己开启一个事务
tx=*****.getTransaction();

}

}
在a1方法中如果存在事务,如 tx=*****.getTransaction();
则在调b1的时候,就会b1则会加入到这个事务中。
如果在a1中没有事务,那么在b1方法中,就会自己开启一个事务。


2:RequiredNew
新建事务,如果当前存在事务,把当前事务挂起。

例如:
A{
void a1()
{
tx=*****.getTransaction();

B.b1();

}


}


B{
void b1()
{


tx=*****.getTransaction();

}

}

如果a1,和b1都有开启事务,那么当在执行b1的时候,a1的事务会被挂起,当b1执行完毕,继续执行a1的事务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值