一、资源入口
这次很快就找到了入口
在MySQL官方文档界面查找(MySQL Server—>MySQL Reference Manual—>选定自己的版本,当然也可以下载的 )不过说真的还是下载下来HTML比较方便点,打开Index.html就是目录了,我在其中搜索字段‘transaction’然后可以快速定位自己关心的内容。
我已经得到的信息
- glossary.html 词汇表
二、词汇表中关于Transaction的描述
- Transaction:是最小的工作单元(atomic units of work),可以被提交(committed)或者回滚(rolled back)。当一个事务对数据库做出多个改变/操作的时候可能发生两种状况:①、当这个事务被提交(commit)之后,这个事务对数据库所做的所有操作都成功了;②、事务被提交(commit)之后,当事务中多个操作/改变因为有某一个因为出错或者别的什么原因不能完成的时候这个事务(所有的操作/改变)不管是否已经完成了一部分,都会发生回滚(rolled backed)使数据库恢复到commit之前的状态。
- 事务,由
InnoDB
实现,有一些属性,这些属性被统称为:(按首字母缩写)ACID具体包括:
- atomicity(原子性)
- 在SQL上下文中,Transaction是一个工作单元,Transaction执行commit之后:要么操作成功(Commited)数据库发生变化,要么回滚(Rall back)数据库不发生变化,工作单元是不可分割的。
- 组成事务处理的语句形成了一个逻辑单元,不能只执行其中的一部分。换句话说,事务是不可分割的最小单元。比如:银行转帐过程中,必须同时从一个帐户减去转帐金额,并加到另一个帐户中,只改变一个帐户是不合理的。
- consistency(一致性)
- 事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。
- 在事务处理执行前后,MySQL数据库是一致的。也就是说,事务应该正确的转换系统状态。比如:银行转帐过程中,要么转帐金额从一个帐户转入另一个帐户(在不考虑转账费用的情况下,转账方减少的金额与收账方的增加的金额应该是相等),要么两个帐户都不变,没有其他的情况。
- isolation(隔离性)
- 一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
- durability(持久性)
- 持久性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。
- atomicity(原子性)
三、对Transaction的控制关键字
- START TRANSACTION or BEGIN start a new transaction.
- COMMIT commits the current transaction, making its changes permanent.
- ROLLBACK rolls back the current transaction, canceling its changes.
- SET autocommit disables or enables the default autocommit mode for the current session.
- 设置自动commit,禁止或启用当前回话的自动提交模式。
- This mode is not recommended for working with InnoDB tables with transactions that span several statements.
- 译:这种模式不推荐你用在包含多个SQL语句的事务中。
To disable autocommit mode implicitly for a single series of statements, use the START TRANSACTION statement:
- 译:在事务中使用
START TRANSACTION
命令可以禁用autocommit。
START TRANSACTION;
//……
COMMIT;
With START TRANSACTION, autocommit remains disabled until you end the transaction with COMMIT or ROLLBACK. The autocommit mode then reverts to its previous state.
- 译:直到 COMMIT or ROLLBACK 之后 autocommit 才恢复到之前的状态。
四、关于在C#代码中使用MySQL事务
我的参考:C#事务处理(Execute Transaction)实例解析
踩了一个坑(错误一):C#入门 错误笔记
//别忘了导包
using MySql.Data.MySqlClient;
//……
//参考逻辑
string insertSql = "INSERT INTO teacher (teacher.id, teacher.utc8_create, teacher.utc8_modify, teacher.`name`, teacher.office, teacher.other, teacher.contact) VALUES (@ID,@Create,@Modify,@Name,@Office,@Other,@Contact)";
string Conn = "Database='for_aurora';Data Source='localhost';User Id='root';Password='root';charset='utf8'";
MySqlConnection mySqlConnection = new MySqlConnection(Conn);//创建连接
mySqlConnection.Open();//先打开连接
MySqlTransaction mySqlTransaction = mySqlConnection.BeginTransaction();//后开启事务
try
{
//执行命令>1
MySqlCommand mSqlCommand_1 = new MySqlCommand();
mSqlCommand_1.Connection = mySqlConnection;
mSqlCommand_1.CommandText = insertSql;
mSqlCommand_1.Parameters.Add(new MySqlParameter("@ID", Guid.NewGuid().ToString("N")));
mSqlCommand_1.Parameters.Add(new MySqlParameter("@Create", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")));
mSqlCommand_1.Parameters.Add(new MySqlParameter("@Modify", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")));
mSqlCommand_1.Parameters.Add(new MySqlParameter("@Name", "name"));
mSqlCommand_1.Parameters.Add(new MySqlParameter("@Office", "Office"));
mSqlCommand_1.Parameters.Add(new MySqlParameter("@Other", "Other"));
mSqlCommand_1.Parameters.Add(new MySqlParameter("@Contact", "Contact"));
mSqlCommand_1.ExecuteNonQuery();
//执行命令>1
//MySqlCommand mSqlCommand_2 = new MySqlCommand();
mSqlCommand_1.Parameters.Clear();
mSqlCommand_1.Connection = mySqlConnection;
mSqlCommand_1.CommandText = insertSql;
mSqlCommand_1.Parameters.Add(new MySqlParameter("@ID", Guid.NewGuid().ToString("N")));
mSqlCommand_1.Parameters.Add(new MySqlParameter("@Create", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")));
mSqlCommand_1.Parameters.Add(new MySqlParameter("@Modify", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")));
mSqlCommand_1.Parameters.Add(new MySqlParameter("@Name", "name"));
mSqlCommand_1.Parameters.Add(new MySqlParameter("@Office", "Office"));
mSqlCommand_1.Parameters.Add(new MySqlParameter("@Other", "Other"));
mSqlCommand_1.Parameters.Add(new MySqlParameter("@Contact", "Contact"));
mSqlCommand_1.ExecuteNonQuery();
//命令若干……
}
catch (Exception exception)
{
Console.WriteLine(exception.ToString());
mySqlTransaction.Rollback();
mySqlConnection.Close();
}
finally {
Console.WriteLine("状态:" + mySqlConnection.State);
if (mySqlConnection.State != ConnectionState.Closed) {
mySqlTransaction.Commit();
mySqlConnection.Close();
}
}