c# mysql代码中写事务_mysql——数据库事务(C#代码)

一、引言

MySQL事务主要用来处理数据量大、数据复杂度高的数据操作,最经典的使用场景是银行的转账:需要先从银行账户A中取出钱,然后再存入银行账户B中,如果中间出现问题,而没有事务的保证,那么就会出现B收不到钱,而A支出钱又回不到自己的账户的严重问题,那么有了事务机制,这个问题就解决了。

总之,事务是处理crid中cid三种操作,要不全执行要不全不执行==

二、基本概念

2.1  事务特点

1、A(Atomicity),即事务的原子性

一组事务操作,要么都成功,要么都撤回。

2、C(Consistency),即事务的稳定性

有非法数据操作,如:外键约束,事物撤回。

3、I(Isolation),即事务的隔离性

事务是独立运行的,一个事务的操作如果影响了另一个事物,那么另一个事务就会撤回执行,要做到事务100%的隔离,需要牺牲速度和性能。

4、D(Durability),即事务的可靠性

当数据库崩溃之后,InnoDB数据库表驱动会利用日志文件进行数据的重构修改,需要注意的是:安全性和性能速度不可兼得。

2.2  事务隔离

1、并发时遇到的问题

在事务并发操作时,经常出现一些问题,这些问题可用几个术语名词描述:

A、脏读

一个事务读取了另一个事务并发写的未提交的数据,比如:事务A读取了事务B写入的数据,但是B事务并未提交,后来其撤销了修改,此时事务A就读取了不该读取的数据。

B、幻读

一个事务重复读取数据,在获得的数据行中发现某些数据是其它事务最近操作的数据,比如:事务A反复执行查询语句查询数据表,而这时另一事务B正在操作该表,恰好的是事务B操作的数据正符合事务A查询的条件,而事务A再读取时,发现结果集发生了变化,这在并发事务时经常出现。

C、不可重复读

一个事务重复读取之前读取过的数据,后发现读取的数据被另一个事务所修改,比如:事务A反复读取指定的数据,而此时事务B正好操作该数据,当事务A再次查询时,发现之前读取的数据已经变化。

注:

上面事务并发出现的问题,可以通过设置事务的隔离来处理,但不能完全依赖事务隔离,而是应该在应用程序中恰当的使用锁来控制并发访问,两者的结合是解决的问题关键。

2、事务的隔离级别

事务隔离级别分为4种:

READ UNCOMMITED // 允许幻读,脏读及不可重复读;

READ COMMITED   // 允许幻读和不可重复读,不允许脏读;

REPEATABLE READ // 允许幻读,不允许脏读和不可重复读;

SERIALIZABLE READ // 不允许幻读,脏读及不可重复读;

注:

Mysql默认的是REPEATABLEREAD级别。另外,随着事务的隔离级别越高,并发执行的性能就越低,所以适当选择级别并结合业务需求来选定级别设置。

三、代码使用

C#中的使用

public static bool ExcuteTransactionSQL(ListstrSQL)

{

using (MySqlConnection conn = new MySqlConnection(strConn))

{

conn.Open();

MySqlTransaction transaction = conn.BeginTransaction();

MySqlCommand cmd = new MySqlCommand();

cmd.Connection = conn;

cmd.Transaction = transaction;

try

{

for (int n = 0; n < strSQL.Count; n++)

{

string strsql = strSQL[n];

if (strsql.Trim().Length > 1)

{

cmd.CommandText = strsql;

cmd.ExecuteNonQuery();

}

}

cmd.ExecuteNonQuery();

transaction.Commit();

conn.Close();

return true;

}

catch

{

transaction.Rollback();

conn.Close();

return false;

}

}

}

四、总结

事务的使用场景

事务ACID

事务的隔离

事务在代码中的使用

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值