轻型事务:Transaction
SqlConnection mycon = new SqlConnection(constr);
mycon.Open();
SqlCommand cmd = new SqlCommand();
SqlTransaction mytran = mycon.BeginTransaction();
//绑定数据库连接和事务对象
cmd.Connection = mycon;
cmd.Transaction = mytran;
try
{
cmd.CommandText = "use WDERPDATA_002";
cmd.CommandText = "insert into TBASE_DEPT(BM_FZ_CODE,BM_DEPT_CODE,BM_DEPT_NAME,BM_STATUS) values('01','01','develop','1') ";
cmd.ExecuteNonQuery();
cmd.CommandText = "insert into TBASE_DEPT(BM_FZ_CODE,BM_DEPT_CODE1,BM_DEPT_NAME,BM_STATUS) values('01','02','develop1','1') ";
cmd.ExecuteNonQuery();
cmd.CommandText = "insert into TBASE_DEPT(BM_FZ_CODE,BM_DEPT_CODE,BM_DEPT_NAME,BM_STATUS) values('01','03','develop2','1') ";
cmd.ExecuteNonQuery();
//cmd.CommandText = "create database Hello";
//cmd.ExecuteNonQuery();
mytran.Commit();
}
catch (Exception ex)
{
mytran.Rollback();
Console.Write("事务操作出错,已回滚。系统信息:" + ex.Message);
}
finally
{
mycon.Close();
}
分布式事务处理
msdn:
System.Transactions 基础结构既提供了基于 Transaction 类的显式编程模型(CommittableTransaction),也提供了使用 TransactionScope 类的隐式编程模型,在后一种模型中,事务由该基础结构自动管理.
(MSDN: 建议使用
TransactionScope 类创建隐式事务,以便自动为您管理环境事务上下文。对于需要跨多个函数调用或多个线程调用使用相同事务的应用程序,您还应该使用
TransactionScope 和
DependentTransaction 类。有关此模型的更多信息,请参见
使用事务范围实现隐式事务 主题。)
CommittableTransaction :
CommittableTransaction 不会自动设置环境事务(环境事务是您的代码在其中执行的事务)。可以通过调用全局
Transaction 对象的静态
Current 属性获取或设置环境事务。有关环境事务的更多信息,请参见
使用事务范围实现隐式事务 主题的“Managing Transaction Flow using TransactionScopeOption”
TransactionScope:
如果在事务范围中(即从初始化 TransactionScope 对象到调用其 Dispose 方法之间)未发生异常,则允许该范围所参与的事务继续。如果事务范围中的确发生了异常,它所参与的事务将回滚。
当应用程序完成它要在一个事务中执行的所有工作以后,您应当只调用 Complete 方法一次,以通知事务管理器可以接受提交事务。未能调用此方法将中止该事务。
对 Dispose 方法的调用标志着该事务范围的结束。在调用此方法之后发生的异常不会影响该事务。
如果在范围中修改 Current 的值,则会在调用 Dispose 时引发异常。但是,在该范围结束时,先前的值将被还原。此外,如果在创建事务的事务范围内对 Current 调用 Dispose,则该事务将在相应范围末尾处中止。
上面重点看点:使用 TransactionScopeOption 管理事务流
2,DependentTransaction 依赖事务处理
3,跨多个函数调用//多个线程调用 使用相同环境事务:
多个线程中调用环境事务中,必须使用DependentTransaction 依赖事务,将Transaction.Current 设置为依赖项
1、远程访问数据库大概模型
2、mysql在win7、linux上如何设置:
2.1、分配权限(linux和win7)
进行mysql命令行,进行分配权限、执行
GRANT
ALL
PRIVILEGES
ON
*
.
*
TO
'
Lucy
'
@
'
192.168.1.102
'
IDENTIFIED
BY
'
123
'
WITH
GRANT
OPTION
;
ALL PRIVILEGES分配所有的权限,如Select、Insert、Delete、Update、Drop、Create等等
*.*是 数据库.数据库中的表
'Lucy'是远程机子要访问本计算机的所需要的用户名(这个由mysql分配用户给远程机子,当然,还要通过一下步的3306端口)
'192.168.1.102'是远程机子的IP地址(这个由mysql指定远程机子哪个IP地址可以让访问)
'123'是远程机子知道了用户,需要访问的用户密码(这个也是由mysql分配密码给远程机子)
所以也可以归纳为:
GRANT
ALL
PRIVILEGES
ON
数据库.数据库表
TO
'
远程机用户名
'
@
'
远程机IP
'
IDENTIFIED
BY
'
远程机用户密码
'
WITH
GRANT
OPTION
;
2.2、打开3306端口
2.2.1、为什么要打开3306端口?
因为防火墙问题,例如:
IIS配置ASP后,局域网的机子不能访问本机的网页(如果默认端口是80),而关掉防火墙就可以。是因为你的80端口没有打开。
而mysql的默认端口3306是默认没有打开的。
2.2.2、为什么我们远程访问SQL的时候,不用打开端口?
因为SQL的端口是默认打开的,而你远程访问SQL数据库的时候,只要知道它的用户名、密码、端口号1433就行了。
2.2.3、如何打开mysql的端口
2.2.4、在win7上,只要在‘入站规则’上建立一个3306端口即可。
控制面板=>管理工具=>高级安全的Windows防火墙=>入站规则
然后新建规则=>选择‘端口’=>在‘特定本地端口’上输入一个‘3306’=>选择‘允许连接’=>选择‘域’、‘专用’、‘公用’
=>给个名称,如:mysqlinput
2.2.5、在linux的ubuntu上,对mysql的配置文件进行配置均可。
按F3(打开命令行)=>输入"sudo vi /etc/mysql/my.cnf"(用vim打开)=>
# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
bind-address = 127.0.0.1
注释掉bind-address均可,即#bind-address = 127.0.0.1,表示允许通过远程端口3306访问。
=>重启mysql,即在命令行输入"sudo /etc/init.d/mysql restart"
3、客户端(win7或ubuntu下载 MySQL ODBC 3.51 Driver,因为在ubuntu上有人用Mono搞C#,所以ubuntu也提进去)
安装完后,在win7下怎么看你有了MySQL ODBC 3.51 Driver这个驱动程序呢?(Mono我就帮不了忙了,因为我没有使用过)
控制面板=>管理工具=>数据源(ODBC)=>驱动程序
4、C#方面
这里就简单写一个对方存在的数据库(information_schema是默认存在的),这里用的是asp
using
System;
using
System.Collections.Generic;
using
System.Linq;
using
System.Web;
using
System.Web.UI;
using
System.Web.UI.WebControls;
using
System.Data;
using
System.Data.Odbc;
namespace
Help
{
public
partial
class
WebForm2 : System.Web.UI.Page
{
protected
void
Page_Load(
object
sender, EventArgs e)
{
string
strconn
=
"
Driver={MySQL ODBC 3.51 Driver};Server=192.168.1.102;Database=information_schema;User=Lucy; Password=123;Option=3;chartset=utf8
"
;
string
sql
=
"
select * from CHARACTER_SETS
"
;
OdbcConnection myConnection
=
new
OdbcConnection(strconn);
OdbcCommand myCommand
=
new
OdbcCommand(sql, myConnection);
myConnection.Open();
//
DropDownList1.DataSource = myCommand.ExecuteReader(CommandBehavior.CloseConnection);
//
DropDownList1.DataTextField = "name";
//
DropDownList1.DataValueField = "id";
//
DropDownList1.DataBind();
OdbcDataAdapter sda
=
new
OdbcDataAdapter();
sda.SelectCommand
=
myCommand;
DataSet ds
=
new
DataSet();
sda.Fill(ds);
GridView1.DataSource
=
ds;
GridView1.DataBind();
myConnection.Close();
}
}
}
5、远程访问后,运行效果:
6、总结
6.1、操作系统上大部分有一些共性,其操作思想是可以移植的。
6.2、如何看懂相应的配置文件说明是很重要的。
6.3、命令行多少也得学一些。至少打开‘服务’的时候,输入services.msc,就可以打开服务了。
6.4、抽象出自己可理解和实际相结合的模型是挺重要的。