事务:指作为单个逻辑工作单元执行的一系列操作,而这些逻辑工作单元需要具有原子性,一致性,隔离性和持久性四个属性。统称为ACID属性。
A:Atomicity 原子性(不可分性)
原子性:指事务必须是原子工作单元,不可分隔性,即对于事务所进行数据修改,要么全部执行,要么全都不执行。
C:Consistency 一致性
指事务在完成时,必须使所有的数据都保持一致性状态,而且在相关数据库中,所有规则都必须应用于事务的修改。以保持所有数据的完整性。
也就是说,如果有多个表中放有一个人的信息,那如果你要修改这个人的信息,就必须多个表中的信息都要修改,不能有的修改,有的不修改。
I:Isolation 隔离性
事务与其他事务是隔离的,也就是说一个事务的一项工作对数据进行修改时,如果整个事务还没有结束,其他事务就无法知道这个数据发生了修改。
D:Durability 持久性
指事务完成之后,它对于系统的影响是永久性的,即使系统出现故障也是如此。比如说,我们把一个人的记录放在磁盘上这后,停电了,这个人的记录已经存在磁盘上了,不可能来电以后又没有了。
{
conn.Open();
using (SqlTransaction tran = conn.BeginTransaction())
{
using (SqlCommand cmd = new SqlCommand())
{
cmd.Connection = conn;
cmd.CommandType = CommandType.Text;
cmd.Transaction = tran;
try
{
cmd.CommandText = " insert into TranTable(Priority) values(1) " ;
cmd.ExecuteNonQuery();
cmd.CommandText = " insert into TranTable(Priority) values(256) " ;
cmd.ExecuteNonQuery();
tran.Commit();
Response.Write( " Ok " );
}
catch (SqlException ex)
{
tran.Rollback();
Response.Write( " Error: " + ex.Message);
}
}
}
conn.Close();
}
using Oracle.DataAccess.Client;
using System.Collections.Generic;
public class DepInfoDAL:IDepInfo
{
private Database db;
#region 构造函数
public DepInfoDAL()
{
db = DatabaseFactory.CreateDatabase( " ConnectionString " );
}
#endregion
#region
public bool Del( string depinfoid, EnumSchoolState state)
{
using (OracleConnection cn = (OracleConnection)db.CreateConnection())
{
cn.Open();
OracleTransaction transaction = cn.BeginTransaction();
try
{
Del(depinfoid, state, transaction);
AddNotice(depinfoid,transaction);
transaction.Commit();
return true ;
}
catch (OracleException er)
{
transaction.Rollback();
return false ;
}
}
}
#endregion
#region
public void Del( string depinfoid, EnumSchoolState state, OracleTransaction transaction)
{
string sql = " update depinfo set depstate=:PI_depstate where depinfoid=:PI_depinfoid " ;
OracleCommand dbCommend = (OracleCommand)db.GetSqlStringCommand(sql);
OracleParameter[] orap =
{
new OracleParameter( " PI_depstate " ,OracleDbType.Varchar2,(( int )state).ToString(),ParameterDirection.Input),
new OracleParameter( " PI_Depinfoid " ,OracleDbType.Varchar2,depinfoid,ParameterDirection.Input),
};
foreach (OracleParameter parm in orap)
{
dbCommend.Parameters.Add(parm);
}
db.ExecuteNonQuery(dbCommend, transaction);
}
#endregion
#region
public bool AddNotice( string depinfoid)
{
using (OracleConnection cn = (OracleConnection)db.CreateConnection())
{
cn.Open();
OracleTransaction transaction = cn.BeginTransaction();
try
{
Del(depinfoid, state, transaction);
// notice
Add(depinfoid,state,transaction);
transaction.Commit();
return true ;
}
catch (OracleException er)
{
transaction.Rollback();
return false ;
}
}
}
#endregion
#region
public void AddNotice( string depinfoid, OracleTransaction transaction)
{
string sql = " Insert Into notice(noticeid,depinfoid,content) values (sq_notice_noticeid.nextval,:PI_depinfoid,:PI_content) " ;
OracleCommand dbCommend = (OracleCommand)db.GetSqlStringCommand(sql);
OracleParameter[] orap =
{
new OracleParameter( " PI_depinfoid " ,OracleDbType.Varchar2,depinfoid,ParameterDirection.Input),
new OracleParameter( " PI_content " ,OracleDbType.Varchar2, " 11111 " ,ParameterDirection.Input),
};
foreach (OracleParameter parm in orap)
{
dbCommend.Parameters.Add(parm);
}
db.ExecuteNonQuery(dbCommend, transaction);
}
#endregion
}
{
public static void Get( string userinfoid)
{
using (TransactionScope scope = new TransactionScope())
{
scoreDal SD = new scoreDal();
try
{
// 你的业务代码
SD.Add(userinfoid, 1 );
SD.reduce(userinfoid, 11 );
scope.Complete();
}
catch (Exception e)
{
}
finally
{
// scope.Dispose(); 使用using 会自动释放资源
}
}
}
}
using System.Collections.Generic;
using System.Linq;
using System.Text;
using wdxt_Score.IDAL;
using Microsoft.Practices.EnterpriseLibrary.Data;
using Oracle.DataAccess.Client;
using System.Data;
public class scoreDal : Iscore
{
private Database db;
public scoreDal()
{
db = DatabaseFactory.CreateDatabase( " ConnectionString " );
}
public void Add( string userinfoid, int basevalue)
{
string sql = " Insert Into TEXT " ;
sql += " (ID,VALUE) " ;
sql += " values(:PI_userinfoid,:PI_basevalue) " ;
OracleCommand dbCommend = (OracleCommand)db.GetSqlStringCommand(sql);
OracleParameter[] orap =
{
new OracleParameter( " PI_userinfoid " ,OracleDbType.Varchar2,userinfoid,ParameterDirection.Input),
new OracleParameter( " PI_basevalue " ,OracleDbType.Varchar2,basevalue,ParameterDirection.Input),
};
foreach (OracleParameter parm in orap)
{
dbCommend.Parameters.Add(parm);
}
db.ExecuteNonQuery(dbCommend);
}
public void reduce( string userinfoid, int basevalue)
{
string sql = " Insert Into TEXT " ;
sql += " (ID,VALUE) " ;
sql += " values(:PI_userinfoid,:PI_basevalue) " ;
OracleCommand dbCommend = (OracleCommand)db.GetSqlStringCommand(sql);
OracleParameter[] orap =
{
new OracleParameter( " PI_userinfoid " ,OracleDbType.Varchar2,userinfoid,ParameterDirection.Input),
new OracleParameter( " PI_basevalue " ,OracleDbType.Varchar2,basevalue,ParameterDirection.Input),
};
foreach (OracleParameter parm in orap)
{
dbCommend.Parameters.Add(parm);
}
db.ExecuteNonQuery(dbCommend);
}
}
上一个项目用三层架构事务都放在数据层,其实应该用隐式事务,放在业务层是最合适的。
这篇写的都是在.net中的事务,还有在数据库中实现,利用com组件等,在数据库中使用事务又有所不同,
有兴趣可以看看这篇文章Oracle与SQL Server事务处理的比较 。
4、三种事务处理