1:本地事务DbTransaction和分布式事务TransactionScope的区别:
1.1:System.Data.Common.DbTransaction:
1.2:System.Transactions.TransactionScope:
using (System.Transactions.TransactionScope ts =
new System.Transactions.TransactionScope())
{
// 代码块A
// 代码块B
ts.Complete(); // 提交事务
}
{
// 代码块A
// 代码块B
ts.Complete(); // 提交事务
}
2:可以用本地事务解决,避免使用分布式事务场景:
2.1:项目只有一个数据库,这个是最应该避免,多个表间的事务, 完全是本地事务可处理的范围:
2.2:项目多个数据库,如果数据库间使用了相同的访问账号和密码,这种情况也可以避免:
3:回顾下我以前的项目场景:
3.1:从下图是我08年在中域的项目:有19个数据库,对于数据库链接而言,唯一的不同只有数据库的名称:
进化:能不能只保留一条,其它的通过动态切换数据库名称来改链接字符串?
3.2:那时候,我的架构还是很新手,通过CodeSmith生成了大量的代码文件:
进化:能不能消灭这些大量的文件,简单是我们不断追求的目标。
3.3:这么多数据库,如何跨数据库事务?
进化:能不能本地事务搞定这些,这是每个ORM可以思考的方向。
4:CYQ.Data 提供的解决方案:
4.1:多个数据库的数据库链接切换:
<add name=
"
Conn
" connectionString=
"
server=.;database=demo;uid=sa;pwd=123456
"/>
using (MAction action =
new MAction(TestEnum.Users))
{
Console.WriteLine(action.ConnectionString);
}
{
Console.WriteLine(action.ConnectionString);
}
这里自动切换了数据为名称为新的链接,而我动手脚的地方就是在枚举的名称了。
4.2:本地多数据库跨事务,示例:
AppDebug.OpenDebugInfo =
true;
AppDebug.Start();
using (MAction action = new MAction(DemoEnum.Users))
{
action.BeginTransation();//开启事务
action.Fill( 12);
Console.WriteLine(action.ConnectionString);//打印数据库链接
action.ResetTable(TestEnum.Users);//切换数据库
Console.WriteLine(action.ConnectionString);//打印数据库链接
action.Fill( 12);
action.EndTransation();
}
Console.WriteLine(AppDebug.Info);//输出所有执行的SQL语句。
AppDebug.Stop();
AppDebug.Start();
using (MAction action = new MAction(DemoEnum.Users))
{
action.BeginTransation();//开启事务
action.Fill( 12);
Console.WriteLine(action.ConnectionString);//打印数据库链接
action.ResetTable(TestEnum.Users);//切换数据库
Console.WriteLine(action.ConnectionString);//打印数据库链接
action.Fill( 12);
action.EndTransation();
}
Console.WriteLine(AppDebug.Info);//输出所有执行的SQL语句。
AppDebug.Stop();