在用C#进行开发的时候,我们会经常用到数据库。有时候需要对数据库多个表进行操作,但是如果我们的命令有问题,其中有部分表的内容变更而其他表的内容却还是保持原样,这样就会导致数据库数据表的冲突,对我们业务功能造成重大影响。
举个栗子,某网页游戏后台有两个表,分别记录玩家的充值记录和玩家权限表格。有玩家充值了,想要获得更高的游戏权限,然而后端程序对数据库操作只有充值记录成功了,而玩家权限表格更新失败。这样导致玩家充值却得不到应有的权限,网页游戏的流量飞速流失。
这个时候,数据库事务操作能够帮助我们解决该问题。
什么是数据库事务
数据库事务是指作为单个逻辑工作单元执行的一系列操作。简单来说,用数据库事务相当于把数据库操作捆绑执行,只要其中一条sql语句失败,直接返回,不进行数据库操作,只有全部执行正确,才会更新数据库。
数据库事务有四个特性, 第一原子性,事务具有独立的不能被拆分的,不能只做部分,事务的性质是要么全做,要么都不做。 第二统一性,在事务执行之前和事务执行之后的数据是一致。 第三隔离性,事务是独立的,开发者不能查看中间状态。对同一张表同一时间最多只能有一个事务处理。 第四永久性,事务的发生对数据库的影响是永久的。
如何数据库事务
使用数据库事务主要有两句命令
1.创建事务对象。 SqlTransanction trans = conn.BeginTransaction(); //注意必须是数据库连接打开后编写
2.把事务对象挂到命令对象上,让命令执行带有事务的功能。 cmd.Transaction = trans;
接下去可以按照普通使用数据库命令那样操作数据库了,
a.成功后调用事务对象的Commit()方法来提交执行的结果。
b.失败后调用事务对象的Rollback()方法来回滚执行前的状态。
下面举个具体应用栗子:
public bool StartTrans(List<String> sqls)//sqls:一系列打算绑定执行的sql语句
{
using (SqlConnection conn=new SqlConnection(constr))//constr:数据库连接配置
{
con.Open();
//开启事务
SqlTransaction trans = conn.BeginTransaction();
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;//添加连接工具
cmd.Transaction = trans;//添加事务
try
{
for (int i = 0; i < sqls.Count; i++)
{
string sql=sqls[i].ToString();//获取sql语句
cmd.CommandText = sql;//添加sql语句
cmd.ExecuteNonQuery();//执行
}
trans.Commit();//执行完成之后提交
return true;
}
catch(Exception e)
{
//执行sql语句失败,事务回滚
trans.Rollback();
return false;
}
finally
{
conn.Close();
}
}
}