最近在做的一个小项目,用到了MySql数据库,以前都没涉及到这方面,所以还是按照了其他数据库的思维来用MySql。可是在做事物的rollback的时候却怎么也不成功。查找了MySql的相关资料才了解到MySql的事务处理和其他数据库还是有区别的。
首先,你在创建MySql数据库表的时候,一定要选择他的引擎为INNODB和BDB类型。只有这两种类型支持事物处理。你可以通过show variables like "have_%"命令查看一下当前的INNODB信息,如果have_innodb一项为YES则,当前数据表支持事物处理。
其次,MySql的事物处理时有两种的。以前我认为数据库用到回滚时,只有设置autocommit,但在MySql里还有别的方式。MySql的事物处理有两种方式:
1、用begin,rollback,commit来实现
begin 开始一个事务
rollback 事务回滚
commit 事务确认
2、直接用set来改变mysql的自动提交模式
MYSQL默认是自动提交的,也就是你提交一个QUERY,它就直接执行!我们可以通过
set autocommit=0 禁止自动提交
set autocommit=1 开启自动提交
来实现事务的处理。
但注意当你用 set autocommit=0 的时候,你以后所有的SQL都将做为事务处理,直到你用commit确认或rollback结束,注意当你结束这个事务的同时也开启了个新的事务!按第一种方法只将当前的作为一个事务!
例子:(第一种方法)
MySqlTransaction tx = con.BeginTransaction();
MySqlCommand cmd = new MySqlCommand("set names gb2312", con);
cmd.Transaction = tx;
cmd.ExecuteNonQuery();
try
{
for (int i = 0; i < sqlList.Count; i++)
{
string strsql = sqlList[i].ToString();
if (strsql.Trim().Length > 1)
{
cmd.CommandText = strsql;
cmd.ExecuteNonQuery();
}
}
//提交所做的Sql操作
tx.Commit();
flag = true;
}
catch (Exception ex)
{
tx.Rollback();
LogManager.WriteLog(LogFile.Error, ex.Message);
}