我有一个可供.NET中所有用户(管理员或有限)使用的应用程序(特别是C#).
当应用程序首次启动时 - 它会在C:\ Documents and Settings\All Users\Documents \中为所有后续启动创建一些所需的文件.
如果XP中的受限用户是启动应用程序的第一个用户,则它可以很好地创建文件,并且受限用户和管理员都可以正常运行.
但是,如果管理员(或者我猜不同的有限用户)是第一个启动应用程序,那么受限用户将无法运行该应用程序.
如果由管理员创建,则无法读取/写入的两个文件是Log4Net日志文件和SQLite db文件.
正在使用straitforward .NET File.Copy(sourcepath,destinationpath)创建SQLite数据库文件.sourcepath是随应用程序一起安装的种子数据库文件 - 所以在第一次运行时它会复制来自C:\ Program Files\app install\seed.db的文件.
有没有办法在复制文件时设置文件的权限?File.SetAccessControl()也许吧?我不清楚它是如何工作的.
另一个问题是log4Net滚动文件追加器不会滚动旧文件并创建新文件,因为管理员用户在运行应用程序时创建了旧文件.
有任何想法吗?具有讽刺意味的是,这一切在Vista中使用有限/管理帐户完全正常 - 这只发生在XP中,具有管理员/有限帐户.
我们遇到Oracle死锁(org.hibernate.util.JDBCExceptionReporter - ORA-00060:在等待资源时检测到死锁)错误.有人建议问题在于使用Hibernate执行只读操作的进程,而另一个进程在同一行上执行更新.
有问题的只读进程是使用Hibernate和Spring配置的.我们没有明确定义服务的事务.虽然这可能不太理想 - 我不明白为什么Hibernate会在没有执行保存/更新操作时尝试在行上获得独占锁定 - 只有get/load.
所以我的问题是:当没有定义显式事务管理时,Hibernate是否尝试在一行上获得读/写锁,即使只执行了对象的"加载".不执行保存/更新.
是否有可能围绕正在加载数据的服务定义一个事务,然后在transactionAttributes上特别说READONLY会导致Hibernate忽略已经存在的行锁并只是加载数据以用于只读目的?
以下是一些代码示例:
为了加载记录,我们使用的是HibernateDaoTemplate
public class HibernatePurchaseOrderDataService extends HibernateDaoSupport implements PurchaseOrderDataService {
public PurchaseOrderData retrieveById(Long id) {
return (PurchaseOrderData)getHibernateTemplate().get(PurchaseOrderData.class, id);
}
}
Run Code Online (Sandbox Code Playgroud)
调用此方法的服务的Spring配置是:
<bean id="orderDataService"
class="com.example.orderdata.HibernatePurchaseOrderDataService">
<property name="sessionFactory" ref="orderDataSessionFactory"/>
</bean>
<bean id="orderDataSessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="hibernateDataSource"/>
<property name="hibernateProperties" ref="hibernateProperties"/>
<property name="mappingResources">
<list>
<value>com/example/orderdata/PurchaseOrderData.hbm.xml</value>
<value>com/example/orderdata/PurchaseOrderItem.hbm.xml</value>
</list>
</property>
</bean>
Run Code Online (Sandbox Code Playgroud)
实际死锁发生在一个PurchaseOrderItem记录上,该记录是通过对LoadOrder的加载调用加载的.
如果正在加载的记录被另一个进程锁定,是否会导致死锁?如果是这样 - 添加一个事务包装器,如下面的那个解决问题?
<bean id="txWrappedOrderDataService"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager" ref="transactionManager"/>
<property name="target" ref="orderDataService"/>
<property name="transactionAttributes">
<props>
<!-- all methods require a transaction -->
<prop key="*">PROPAGATION_REQUIRED,readOnly</prop> …Run Code Online (Sandbox Code Playgroud)