11.38 CastleActiveRecord中如何保证多线程并发操作的安全与成功?
2011-10-13 12:59
423 查看
在多线程并发操作环境中,对数据库的操作也必须注意防止并发控制不适当导致数据混乱,目前已经遇到的情况有:
线程1在保存 类A 的数据,未使用 事务性会话,同时线程2在操作 类B 的数据,使用了 事务性会话,得到的结果是:线程1 的操作全部丢失,线程2 的操作结果正确保存到了数据库。调试错误时却发现,线程1 的程序在测试时由于是单线程环境,运行完全没有问题,开发人员感到莫名其妙,无从下手。
为了避免以上情况,应坚持按如下规则使用会话:
A、纯查询使用无刷新会话,示例如下:
private void DataPortal_Fetch(PartyListCriteria criteria)
{
RaiseListChangedEvents = false;
using (new Castle.ActiveRecord.SessionScope(Castle.ActiveRecord.FlushAction.Never))
{
//添加查询代码如下:
DALParty[] ps = ps = DALParty.Find(criteria.OwnerID, criteria.Name, true,criteria.MaxResult);
}
RaiseListChangedEvents = true;
}
应为有会话的存在,当通过数据实体对象访问 延迟加载数据的一对多关系中多端数据,不会抛出异常。
B、任何有CUD(增删改)操作时,使用事件性会话,示例如下:
protected override void DataPortal_Update()
{
this.RaiseListChangedEvents = false;
using (Castle.ActiveRecord.TransactionScope trans = new Castle.ActiveRecord.TransactionScope())
{
try
{
foreach (var item in DeletedList)
{
item.Child_DeleteSelf(this);
}
DeletedList.Clear();
foreach (var item in this)
{
if (item.IsNew && item.IsValid)
{
item.Child_Insert(this);
}
else if (item.IsDirty && item.IsSavable)
{
item.Child_Update(this);
}
}
trans.VoteCommit();
}
catch (Exception ee)
{
trans.VoteRollBack();
ILog log = LogManager.GetLogger(this.GetType());
log.Error(ee.ToString());
throw ee;
}
}
this.RaiseListChangedEvents = true;
}
线程1在保存 类A 的数据,未使用 事务性会话,同时线程2在操作 类B 的数据,使用了 事务性会话,得到的结果是:线程1 的操作全部丢失,线程2 的操作结果正确保存到了数据库。调试错误时却发现,线程1 的程序在测试时由于是单线程环境,运行完全没有问题,开发人员感到莫名其妙,无从下手。
为了避免以上情况,应坚持按如下规则使用会话:
A、纯查询使用无刷新会话,示例如下:
private void DataPortal_Fetch(PartyListCriteria criteria)
{
RaiseListChangedEvents = false;
using (new Castle.ActiveRecord.SessionScope(Castle.ActiveRecord.FlushAction.Never))
{
//添加查询代码如下:
DALParty[] ps = ps = DALParty.Find(criteria.OwnerID, criteria.Name, true,criteria.MaxResult);
}
RaiseListChangedEvents = true;
}
应为有会话的存在,当通过数据实体对象访问 延迟加载数据的一对多关系中多端数据,不会抛出异常。
B、任何有CUD(增删改)操作时,使用事件性会话,示例如下:
protected override void DataPortal_Update()
{
this.RaiseListChangedEvents = false;
using (Castle.ActiveRecord.TransactionScope trans = new Castle.ActiveRecord.TransactionScope())
{
try
{
foreach (var item in DeletedList)
{
item.Child_DeleteSelf(this);
}
DeletedList.Clear();
foreach (var item in this)
{
if (item.IsNew && item.IsValid)
{
item.Child_Insert(this);
}
else if (item.IsDirty && item.IsSavable)
{
item.Child_Update(this);
}
}
trans.VoteCommit();
}
catch (Exception ee)
{
trans.VoteRollBack();
ILog log = LogManager.GetLogger(this.GetType());
log.Error(ee.ToString());
throw ee;
}
}
this.RaiseListChangedEvents = true;
}
相关文章推荐
- 多线程操作集合时如何保证集合的线程安全性
- volatile 如何保证编译器不去自做主张破坏多线程安全。
- 多线程操作集合时如何保证集合的线程安全性
- 单例模式如何在多线程环境下保证安全—Double Checked Locking 模式使用
- 多线程的问题:如何保证界面的分页参数安全的传递到dao层?
- 多线程操作集合时如何保证集合的线程安全性
- UNIX 如果查询一个共享内存已经被IPCRM,程序中如何操作保证安全
- Oracle如何保证并发操作?
- 【Django】Django如何保证并发操作数据一致性问题
- 多线程,高并发的情况下操作redis当中的数据,如何加锁?
- 如何处理大量数据高并发大流量并发操作方案
- 如何处理大量数据并发操作
- servlet如何实现多线程安全??
- 高并发情况下如何保证消息的顺序
- 如何让ERRNO多线程/进程安全
- CVI多线程数据保护(多个线程操作同一安全变量)
- Linux 多线程应用中如何编写安全的信号处理函数
- 如何才能保证信息化的成功
- 在 Java 的多线程中,如何去判断给定的一个类是否是线程安全的(另外:synchronized 同步是否就一定能保证该类是线程安全的。)