How are cross-shard joins and transactions handled? Are there query patterns that would require application changes despite using the same drivers and ORM?