using System; using System.ComponentModel; using System.Threading.Tasks; using FreeSql; using FreeSql.DataAnnotations; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; namespace aspnetcore_transaction.Controllers { [ApiController] [Route("")] public class HomeController : ControllerBase { private readonly ILogger _logger; public HomeController(ILogger logger) { _logger = logger; } [HttpGet("1")] //[Transactional] public async Task Get([FromServices] BaseRepository repoSong, [FromServices] BaseRepository repoDetail, [FromServices] SongRepository repoSong2, [FromServices] SongService serviceSong) { //repoSong.Insert(new Song()); //repoDetail.Insert(new Detail()); //repoSong2.Insert(new Song()); //serviceSong.Test1(); await serviceSong.Test11(); return "111"; } [HttpGet("2")] [Transactional] public async Task GetAsync([FromServices] BaseRepository repoSong, [FromServices] BaseRepository repoDetail, [FromServices] SongRepository repoSong2, [FromServices] SongService serviceSong) { await repoSong.InsertAsync(new Song()); await repoDetail.InsertAsync(new Detail()); return "111"; } } public class SongService { BaseRepository _repoSong; BaseRepository _repoDetail; SongRepository _repoSong2; public SongService(BaseRepository repoSong, BaseRepository repoDetail, SongRepository repoSong2) { var tb = repoSong.Orm.CodeFirst.GetTableByEntity(typeof(Song)); _repoSong = repoSong; _repoDetail = repoDetail; _repoSong2 = repoSong2; } [Transactional(Propagation = Propagation.Nested)] //sqlite 不能嵌套事务,会锁库的 public void Test1() { _repoSong.Insert(new Song()); _repoDetail.Insert(new Detail()); _repoSong2.Insert(new Song()); } [Transactional(Propagation = Propagation.Nested)] //sqlite 不能嵌套事务,会锁库的 public Task Test11() { return Task.Delay(TimeSpan.FromSeconds(1)).ContinueWith(t => _repoSong.InsertAsync(new Song())); } [Transactional(Propagation = Propagation.Nested)] //sqlite 不能嵌套事务,会锁库的 public async Task Test2() { await _repoSong.InsertAsync(new Song()); await _repoDetail.InsertAsync(new Detail()); await _repoSong2.InsertAsync(new Song()); } [Transactional(Propagation = Propagation.Nested)] //sqlite 不能嵌套事务,会锁库的 public async Task Test3() { await _repoSong.InsertAsync(new Song()); await _repoDetail.InsertAsync(new Detail()); await _repoSong2.InsertAsync(new Song()); return "123"; } } public class SongRepository : DefaultRepository { public SongRepository(UnitOfWorkManager uowm) : base(uowm?.Orm, uowm) { } } [Description("123")] public class Song { /// /// 自增 /// [Column(IsIdentity = true)] [Description("自增id")] public int Id { get; set; } public string Title { get; set; } } public class Detail { [Column(IsIdentity = true)] public int Id { get; set; } public int SongId { get; set; } public string Title { get; set; } } }